|
|
@@ -1,6 +1,8 @@
|
|
|
package com.adealink.weparty.anchor.manager
|
|
|
|
|
|
import com.adealink.frame.aab.util.getCompatString
|
|
|
+import androidx.core.net.toUri
|
|
|
+import androidx.fragment.app.FragmentActivity
|
|
|
import com.adealink.frame.base.CommonDataNullError
|
|
|
import com.adealink.frame.base.Rlt
|
|
|
import com.adealink.frame.data.json.froJsonErrorNull
|
|
|
@@ -8,7 +10,9 @@ import com.adealink.frame.frame.BaseFrame
|
|
|
import com.adealink.frame.log.Log
|
|
|
import com.adealink.frame.network.ISocketNotify
|
|
|
import com.adealink.frame.network.data.Res
|
|
|
+import com.adealink.frame.router.Router
|
|
|
import com.adealink.frame.util.AppUtil
|
|
|
+import com.adealink.frame.util.DisplayUtil
|
|
|
import com.adealink.frame.util.runOnUiThread
|
|
|
import com.adealink.weparty.App
|
|
|
import com.adealink.weparty.R
|
|
|
@@ -18,18 +22,29 @@ import com.adealink.weparty.anchor.datasource.remote.AnchorHttpService
|
|
|
import com.adealink.weparty.anchor.listener.IAnchorListener
|
|
|
import com.adealink.weparty.commonui.BaseActivity
|
|
|
import com.adealink.weparty.commonui.dialogchain.DialogTaskManager
|
|
|
+import com.adealink.weparty.commonui.dialogchain.dialogtask.CommonDialogTask
|
|
|
import com.adealink.weparty.commonui.dialogchain.dialogtask.GenderChangeDialogTask
|
|
|
+import com.adealink.weparty.commonui.widget.CommonDialog
|
|
|
+import com.adealink.weparty.module.account.AccountModule
|
|
|
import com.adealink.weparty.module.anchor.constant.TAG_ANCHOR
|
|
|
import com.adealink.weparty.module.anchor.data.AnchorMessage
|
|
|
+import com.adealink.weparty.module.anchor.data.AnchorMessageButton
|
|
|
import com.adealink.weparty.module.anchor.data.AnchorMessageReplyCode
|
|
|
import com.adealink.weparty.module.anchor.data.AnchorMessageTemplateBody
|
|
|
import com.adealink.weparty.module.anchor.data.AnchorMessageTemplateType
|
|
|
import com.adealink.weparty.module.anchor.data.AnchorMessageType
|
|
|
+import com.adealink.weparty.module.anchor.data.AnchorMsgBtnAction
|
|
|
+import com.adealink.weparty.module.anchor.data.AnchorMsgBtnType
|
|
|
import com.adealink.weparty.module.anchor.data.ReplyAnchorMessageReq
|
|
|
import com.adealink.weparty.module.operation.OperationModule
|
|
|
+import com.adealink.weparty.module.room.Room
|
|
|
+import com.adealink.weparty.module.room.RoomModule
|
|
|
+import com.adealink.weparty.util.goLocalLinkPage
|
|
|
import kotlinx.coroutines.CoroutineScope
|
|
|
import kotlinx.coroutines.launch
|
|
|
import kotlinx.coroutines.withContext
|
|
|
+import okhttp3.MediaType.Companion.toMediaTypeOrNull
|
|
|
+import okhttp3.RequestBody.Companion.toRequestBody
|
|
|
|
|
|
val anchorManager: IAnchorManager by lazy { AnchorManager() }
|
|
|
|
|
|
@@ -67,31 +82,44 @@ class AnchorManager : BaseFrame<IAnchorListener>(), IAnchorManager {
|
|
|
TAG_ANCHOR,
|
|
|
"handleAnchorMessageNotify, messageId:${data.messageId}, messageType: ${data.messageType}, templateMessage:${data.templateMessage}"
|
|
|
)
|
|
|
+
|
|
|
runOnUiThread {
|
|
|
- val templateType = AnchorMessageTemplateType.map(data.templateMessage)
|
|
|
val messageType = AnchorMessageType.map(data.messageType)
|
|
|
- val handle = (templateType != null && templateType != AnchorMessageTemplateType.Non)
|
|
|
- || messageType == AnchorMessageType.MESSAGR_DIAMOND_REWARD_NOTIFY
|
|
|
+ val templateType = AnchorMessageTemplateType.map(data.templateMessage)
|
|
|
+ // 是否是模版消息(非Non)
|
|
|
+ val isTemplateMessage =
|
|
|
+ templateType != null && templateType != AnchorMessageTemplateType.Non
|
|
|
+
|
|
|
+ // 如果是特定消息类型或是有效的模板消息就处理
|
|
|
+ val handle = messageType == AnchorMessageType.MESSAGR_DIAMOND_REWARD_NOTIFY
|
|
|
|| messageType == AnchorMessageType.MESSAGE_IM_DAILY_GREETING_NOTIFY
|
|
|
- || messageType == AnchorMessageType.USER_CHANGE_GENDER
|
|
|
+ || messageType == AnchorMessageType.MESSAGE_USER_CHANGE_GENDER
|
|
|
+ || isTemplateMessage
|
|
|
if (handle) {
|
|
|
- handleAnchorMessage(data)
|
|
|
+ handleAnchorMessage(data, messageType, isTemplateMessage)
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- private fun handleAnchorMessage(data: AnchorMessage) {
|
|
|
- when (AnchorMessageType.map(data.messageType)) {
|
|
|
+ private fun handleAnchorMessage(
|
|
|
+ data: AnchorMessage,
|
|
|
+ messageType: AnchorMessageType?,
|
|
|
+ isTemplateMessage: Boolean
|
|
|
+ ) {
|
|
|
+ Log.i(TAG_ANCHOR, "处理安全相关消息: messageType=${data.messageType}")
|
|
|
+
|
|
|
+ // 不干预原有的实现、再处理通用模版
|
|
|
+ when (messageType) {
|
|
|
AnchorMessageType.MESSAGR_DIAMOND_REWARD_NOTIFY -> {
|
|
|
val activity = (AppUtil.currentActivity as? BaseActivity) ?: return
|
|
|
OperationModule.handleOperationMessage(
|
|
|
activity.supportFragmentManager,
|
|
|
data
|
|
|
- ) { msg, replayCode ->
|
|
|
-
|
|
|
- }
|
|
|
+ ) { msg, replayCode -> }
|
|
|
}
|
|
|
- AnchorMessageType.USER_CHANGE_GENDER->{
|
|
|
+
|
|
|
+ AnchorMessageType.MESSAGE_USER_CHANGE_GENDER -> {
|
|
|
+ // 解析消息体
|
|
|
val messageBody = froJsonErrorNull<AnchorMessageTemplateBody>(data.messageBody)
|
|
|
if (messageBody == null) {
|
|
|
Log.e(TAG_ANCHOR, "消息体解析失败")
|
|
|
@@ -119,7 +147,9 @@ class AnchorManager : BaseFrame<IAnchorListener>(), IAnchorManager {
|
|
|
}
|
|
|
|
|
|
else -> {
|
|
|
-
|
|
|
+ if (isTemplateMessage) {
|
|
|
+ handleAnchorTemplateMessage(data)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -201,4 +231,120 @@ class AnchorManager : BaseFrame<IAnchorListener>(), IAnchorManager {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ override fun handleAnchorTemplateMessage(message: AnchorMessage) {
|
|
|
+ when (AnchorMessageTemplateType.map(message.templateMessage)) {
|
|
|
+ AnchorMessageTemplateType.Normal -> {
|
|
|
+ handleNormalTemplateAnchorMsg(message)
|
|
|
+ }
|
|
|
+
|
|
|
+ // Radio模版暂不处理
|
|
|
+ AnchorMessageTemplateType.Radio -> {}
|
|
|
+ else -> {}
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun handleNormalTemplateAnchorMsg(message: AnchorMessage) {
|
|
|
+ runOnUiThread {
|
|
|
+ val templateBody = message.templateMessageBody
|
|
|
+
|
|
|
+ val title = templateBody?.title
|
|
|
+ val text = templateBody?.text
|
|
|
+ val headUrl = templateBody?.url
|
|
|
+
|
|
|
+ var dialog: CommonDialog? = null
|
|
|
+ val dialogBuilder = CommonDialog.Builder()
|
|
|
+ if (title != null) {
|
|
|
+ dialogBuilder.title(title)
|
|
|
+ }
|
|
|
+ if (text != null) {
|
|
|
+ dialogBuilder.message(text)
|
|
|
+ }
|
|
|
+ if (headUrl != null) {
|
|
|
+ dialogBuilder.topImageUrl(headUrl, DisplayUtil.dp2px(90f), DisplayUtil.dp2px(80f))
|
|
|
+ }
|
|
|
+ var addedBtnCnt = 0
|
|
|
+ val buttons = templateBody?.messageButtons
|
|
|
+ buttons?.forEach loop@{ messageBtn ->
|
|
|
+ //目前只支持加两个按钮
|
|
|
+ if (addedBtnCnt >= 2) {
|
|
|
+ return@loop
|
|
|
+ }
|
|
|
+ if (messageBtn.buttonType == AnchorMsgBtnType.Strong.type) {
|
|
|
+ dialogBuilder.positiveText(messageBtn.buttonText)
|
|
|
+ dialogBuilder.onPositive {
|
|
|
+ onMsgButtonClick(messageBtn)
|
|
|
+ dialog?.dismissAllowingStateLoss()
|
|
|
+ }
|
|
|
+ addedBtnCnt++
|
|
|
+ }
|
|
|
+ if (messageBtn.buttonType == AnchorMsgBtnType.Normal.type) {
|
|
|
+ dialogBuilder.negativeText(messageBtn.buttonText)
|
|
|
+ dialogBuilder.onNegative {
|
|
|
+ onMsgButtonClick(messageBtn)
|
|
|
+ dialog?.dismissAllowingStateLoss()
|
|
|
+ }
|
|
|
+ addedBtnCnt++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (addedBtnCnt == 0) {
|
|
|
+ //如果没有按钮,增加一个确定按钮,点确定已读
|
|
|
+ dialogBuilder.onPositive {
|
|
|
+ dialog?.dismissAllowingStateLoss()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ dialogBuilder.dismissAfterClick(false)
|
|
|
+ .canceledOnTouchOutside(false)
|
|
|
+ .onDismiss { }
|
|
|
+ dialog = dialogBuilder.build()
|
|
|
+
|
|
|
+ // 创建并提交任务
|
|
|
+ val task = CommonDialogTask(message, dialog)
|
|
|
+ DialogTaskManager.submit(task)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun onMsgButtonClick(messageButton: AnchorMessageButton) {
|
|
|
+ when (AnchorMsgBtnAction.map(messageButton.actionType)) {
|
|
|
+ AnchorMsgBtnAction.Deeplink -> {
|
|
|
+ val activity = AppUtil.currentActivity ?: return
|
|
|
+ val deeplink = messageButton.buttonActionUrl
|
|
|
+ var path: String? = null
|
|
|
+ if (deeplink.isEmpty().not()) {
|
|
|
+ path = deeplink.toUri().path
|
|
|
+ }
|
|
|
+ var canDispatch = false
|
|
|
+ if (path != null) {
|
|
|
+ canDispatch = Router.getClazz(path) != null
|
|
|
+ }
|
|
|
+ if (canDispatch) {
|
|
|
+ goLocalLinkPage(activity, messageButton.buttonActionUrl)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ AnchorMsgBtnAction.HttpPost -> {
|
|
|
+ launch {
|
|
|
+ val body =
|
|
|
+ messageButton.buttonActionBody?.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull())
|
|
|
+ anchorHttpService.msgBtnHttpReq(messageButton.buttonActionUrl, body)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ AnchorMsgBtnAction.Logout -> {
|
|
|
+ // 执行登出操作
|
|
|
+ AccountModule.logout()
|
|
|
+ }
|
|
|
+
|
|
|
+ AnchorMsgBtnAction.ExitRoom -> {
|
|
|
+ RoomModule.logout()
|
|
|
+ // 尝试Finish
|
|
|
+ val topActivity = AppUtil.currentActivity ?: return
|
|
|
+ if (topActivity::class.java.name == (Router.getClazz(Room.Room.PATH)?.name ?: "") ) {
|
|
|
+ topActivity.finish()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ AnchorMsgBtnAction.NO -> {}
|
|
|
+ else -> {}
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|