package com.gh.common.util import android.content.Context import android.view.LayoutInflater import android.view.View import android.widget.LinearLayout import android.widget.TextView import com.gh.common.util.CommentUtils.copyText import com.gh.common.view.BugFixedPopupWindow import com.gh.gamecenter.CommentDetailActivity import com.gh.gamecenter.R import com.gh.gamecenter.entity.CommentEntity import com.gh.gamecenter.entity.MeEntity import com.gh.gamecenter.entity.Permissions import com.gh.gamecenter.manager.UserManager import com.gh.gamecenter.qa.comment.OnCommentOptionClickListener import com.gh.gamecenter.retrofit.Response import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils import com.tencent.bugly.beta.tinker.TinkerManager.getApplication import io.reactivex.android.schedulers.AndroidSchedulers import io.reactivex.schedulers.Schedulers import okhttp3.ResponseBody import org.json.JSONException import org.json.JSONObject import retrofit2.HttpException object CommentHelper { @JvmStatic fun showCommunityArticleCommentOptions(view: View, commentEntity: CommentEntity, showConversation: Boolean, articleId: String, communityId: String, ignoreModerator: Boolean = false, listener: OnCommentOptionClickListener?) { showCommentOptions(view = view, commentEntity = commentEntity, showConversation = showConversation, articleId = articleId, communityId = communityId, ignoreModerator = ignoreModerator, listener = listener) } @JvmStatic fun showAnswerCommentOptions(view: View, commentEntity: CommentEntity, showConversation: Boolean, answerId: String, listener: OnCommentOptionClickListener?) { showCommentOptions(view = view, commentEntity = commentEntity, showConversation = showConversation, answerId = answerId, listener = listener) } @JvmStatic fun showVideoCommentOptions(view: View, commentEntity: CommentEntity, showConversation: Boolean, videoId: String, isVideoAuthor: Boolean, listener: OnCommentOptionClickListener?) { showCommentOptions(view = view, commentEntity = commentEntity, showConversation = showConversation, videoId = videoId, isVideoAuthor = isVideoAuthor, listener = listener) } private fun showCommentOptions(view: View, commentEntity: CommentEntity, showConversation: Boolean, articleId: String? = null, communityId: String? = null, answerId: String? = null, videoId: String? = null, ignoreModerator: Boolean = false, isVideoAuthor: Boolean = false, listener: OnCommentOptionClickListener? = null) { val context = view.context val dialogOptions = ArrayList() if (isVideoAuthor || (videoId != null && commentEntity.user.id == UserManager.getInstance().userId)) { dialogOptions.add("删除评论") } dialogOptions.add("复制") dialogOptions.add("投诉") commentEntity.me?.let { if (ignoreModerator) return@let if (it.isModerator || (it.moderatorPermissions.hideAnswerComment > Permissions.GUEST || it.moderatorPermissions.topAnswerComment > Permissions.GUEST || it.moderatorPermissions.hideCommunityArticleComment > Permissions.GUEST || it.moderatorPermissions.topCommunityArticleComment > Permissions.GUEST)) { dialogOptions.add("管理") } } if (commentEntity.parentUser != null && showConversation) { dialogOptions.add("查看对话") } val inflater = LayoutInflater.from(context) val layout = inflater.inflate(R.layout.comment_more_option, null) val popupWindow = BugFixedPopupWindow(layout, LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT) val container = layout.findViewById(R.id.container) for (text in dialogOptions) { val item = inflater.inflate(R.layout.comment_more_option_item, container, false) container.addView(item) val hitText = item.findViewById(R.id.hint_text) hitText.text = text item.setOnClickListener { popupWindow.dismiss() listener?.onCommentOptionClick(commentEntity, text) when (text) { "管理" -> showControlDialog(context, answerId, articleId, communityId, commentEntity, commentEntity.me!!) "复制" -> copyText(commentEntity.content, context) "投诉" -> { context.ifLogin("回答详情-评论-投诉") { showReportTypeDialog(context, !videoId.isNullOrEmpty()) { reportType -> val commentListener = object : PostCommentUtils.PostCommentListener { override fun postSuccess(response: JSONObject?) { Utils.toast(context, "感谢您的投诉") } override fun postFailed(error: Throwable?) { if (error == null) { Utils.toast(context, "投诉失败,请稍后重试") } else { Utils.toast(context, "投诉失败,${error.message}") } } } if (answerId != null) { PostCommentUtils.postAnswerReportData(context, commentEntity.id, answerId, reportType, commentListener) } else if (articleId != null) { PostCommentUtils.reportCommunityArticleComment(context, communityId, articleId, commentEntity.id, reportType, commentListener) } else { PostCommentUtils.reportVideoComment(context, videoId, commentEntity.id, reportType, commentListener) } } } } "查看对话" -> { if (answerId != null) { context.startActivity(CommentDetailActivity .getAnswerCommentIntent(context, commentEntity.id, answerId, null)) } else if (articleId != null) { context.startActivity(CommentDetailActivity .getCommunityArticleCommentIntent(context, articleId, commentEntity.id, communityId, null)) } else { context.startActivity(CommentDetailActivity .getVideoCommentIntent(context, commentEntity.id, videoId, isVideoAuthor, null)) } } } } } popupWindow.isTouchable = true popupWindow.isFocusable = true popupWindow.showAutoOrientation(view) } private fun showControlDialog(context: Context, answerId: String? = null, articleId: String? = null, communityId: String? = null, comment: CommentEntity, me: MeEntity) { val dialogOptions = arrayListOf() val highlight = "置顶评论" val hide = "隐藏评论" var canHighlightCommentDirectly = false var canHideCommentDirectly = false if (me.moderatorPermissions.topAnswerComment > Permissions.GUEST || me.moderatorPermissions.topCommunityArticleComment > Permissions.GUEST) { dialogOptions.add(highlight) if (me.moderatorPermissions.topAnswerComment > Permissions.REPORTER || me.moderatorPermissions.topCommunityArticleComment > Permissions.REPORTER) { canHighlightCommentDirectly = true } } if (me.moderatorPermissions.hideAnswerComment > Permissions.GUEST || me.moderatorPermissions.hideCommunityArticleComment > Permissions.GUEST) { dialogOptions.add(hide) if (me.moderatorPermissions.hideAnswerComment > Permissions.REPORTER || me.moderatorPermissions.hideCommunityArticleComment > Permissions.REPORTER) { canHideCommentDirectly = true } } val highlightDialogHintContent = if (canHighlightCommentDirectly) { "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)" } else { "你的操作将提交给小编审核,确定提交吗?" } val hideDialogHintContent = if (canHideCommentDirectly) { "你的操作将立即生效,确定提交吗?(你的管理权限为:高级)" } else { "你的操作将提交给小编审核,确定提交吗?" } val disabledOptions = arrayListOf() if (comment.priority != 0) { disabledOptions.add(highlight) } comment.me?.let { if (it.isCommentOwner) { disabledOptions.add(highlight) } } DialogUtils.showListDialog(context, dialogOptions, disabledOptions) { when (it) { highlight -> { if (comment.priority != 0) { Utils.toast(context, "评论已经置顶") return@showListDialog } comment.me?.let { me -> if (me.isCommentOwner) { Utils.toast(context, "不能置顶自己的评论") return@showListDialog } } val highlightObserver = object : Response() { override fun onResponse(response: ResponseBody?) { if (canHighlightCommentDirectly) { Utils.toast(context, "置顶成功,请刷新列表") } else { Utils.toast(context, "提交成功") } } override fun onFailure(e: HttpException?) { super.onFailure(e) e?.let { httpException -> if (httpException.code() == 403) { val string = e.response().errorBody()?.string() val errorJson = JSONObject(string) val errorCode = errorJson.getInt("code") if (errorCode == 403059) { Utils.toast(getApplication(), "权限错误,请刷新后重试") return } else { Utils.toast(getApplication(), e.message()) } } } } } if (answerId != null) { DialogUtils.showAlertDialog(context, highlight, highlightDialogHintContent, "确定", "取消", { RetrofitManager.getInstance(context).api .highlightAnswerComment(answerId, comment.id) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(highlightObserver) }, null) } else { DialogUtils.showAlertDialog(context, highlight, highlightDialogHintContent, "确定", "取消", { RetrofitManager.getInstance(context).api .highlightCommunityArticleComment(communityId, articleId, comment.id) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(highlightObserver) }, null) } } hide -> { val hideObserver = object : Response() { override fun onResponse(response: ResponseBody?) { if (canHideCommentDirectly) { Utils.toast(context, "隐藏成功,请刷新列表") } else { Utils.toast(context, "提交成功") } } override fun onFailure(e: HttpException?) { super.onFailure(e) e?.let { httpException -> if (httpException.code() == 403) { val string = e.response().errorBody()?.string() val errorJson = JSONObject(string) val errorCode = errorJson.getInt("code") if (errorCode == 403059) { Utils.toast(getApplication(), "权限错误,请刷新后重试") return } else { Utils.toast(getApplication(), e.message()) } } } } } if (answerId != null) { DialogUtils.showAlertDialog(context, hide, hideDialogHintContent, "确定", "取消", { RetrofitManager.getInstance(context).api .hideAnswerComment(answerId, comment.id) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(hideObserver) }, null) } else { DialogUtils.showAlertDialog(context, hide, hideDialogHintContent, "确定", "取消", { RetrofitManager.getInstance(context).api .hideCommunityArticleComment(communityId, articleId, comment.id) .observeOn(AndroidSchedulers.mainThread()) .subscribeOn(Schedulers.io()) .subscribe(hideObserver) }, null) } } } } } private fun showReportTypeDialog(context: Context, isVideoComment: Boolean, reportCallback: (reportType: String) -> Unit) { val reportTypes = arrayListOf("垃圾广告营销", "恶意攻击谩骂", "淫秽色情信息", "违法有害信息", "其它") if (!isVideoComment) { DialogUtils.showListDialog(context, reportTypes, null) { text -> val jsonObject = JSONObject() try { jsonObject.put("reason", text) reportCallback.invoke(jsonObject.toString()) } catch (e: JSONException) { e.printStackTrace() } } } else { DialogUtils.showVideoComplaintDialog(context, reportTypes, null) { text -> reportCallback.invoke(text) } } } }