Просмотр исходного кода

feat: 私聊模块bug修复&imkit代码迁移

wutiaorong 1 год назад
Родитель
Сommit
574981344e
100 измененных файлов с 978 добавлено и 2012 удалено
  1. 0 3
      app/src/main/java/com/adealink/weparty/App.kt
  2. 22 14
      app/src/main/java/com/adealink/weparty/commonui/widget/floatview/view/SwipeToTopConstraintLayout.kt
  3. 0 65
      app/src/main/java/com/adealink/weparty/im/IMConfig.kt
  4. 4 0
      app/src/main/java/com/adealink/weparty/module/message/IMessageService.kt
  5. 17 0
      app/src/main/java/com/adealink/weparty/module/message/MessageModule.kt
  6. 1 0
      app/src/main/java/com/adealink/weparty/module/message/Router.kt
  7. 1 1
      app/src/main/java/com/adealink/weparty/module/message/data/TargetIdExt.kt
  8. 1 1
      app/src/main/java/com/adealink/weparty/module/message/dot/MessageDot.kt
  9. 1 1
      app/src/main/java/com/adealink/weparty/module/message/dot/NormalMessageDot.kt
  10. 9 3
      app/src/main/java/com/adealink/weparty/module/message/view/SocialAvatarDecorView.kt
  11. 4 1
      app/src/main/java/com/adealink/weparty/module/profile/IProfileService.kt
  12. 20 4
      app/src/main/java/com/adealink/weparty/module/profile/ProfileModule.kt
  13. 2 1
      app/src/main/java/com/adealink/weparty/module/profile/viewmodel/IProfileViewModel.kt
  14. 0 7
      app/src/main/java/com/adealink/weparty/token/Data.kt
  15. 0 11
      app/src/main/java/com/adealink/weparty/token/TokenHttpService.kt
  16. 2 2
      app/src/main/java/com/adealink/weparty/ui/home/BaseHomeFragment.kt
  17. 5 0
      app/src/main/java/com/adealink/weparty/ui/home/util/HomeUIUtil.kt
  18. 3 1
      app/src/main/java/com/adealink/weparty/widget/floatview/FloatViewFactory.kt
  19. 3 20
      app/src/main/res/layout/layout_social_avatar_decor.xml
  20. 1 7
      frame/imkit/build.gradle
  21. 33 100
      frame/imkit/src/main/java/com/adealink/frame/imkit/IMService.kt
  22. 0 9
      frame/imkit/src/main/java/com/adealink/frame/imkit/config/IIMConfig.kt
  23. 0 11
      frame/imkit/src/main/java/com/adealink/frame/imkit/config/IMConfigCenter.kt
  24. 1 1
      frame/imkit/src/main/java/com/adealink/frame/imkit/config/MessageInterceptor.java
  25. 0 16
      frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/DefaultExtensionConfig.kt
  26. 0 7
      frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/IExtensionAttachInfoListener.kt
  27. 0 12
      frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/IExtensionConfig.kt
  28. 0 83
      frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/messagelist/status/IMessageState.kt
  29. 0 11
      frame/imkit/src/main/java/com/adealink/frame/imkit/conversationlist/provider/PrivateConversationProvider.kt
  30. 0 3
      frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/PageDestroyEvent.kt
  31. 0 3
      frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/ScrollEvent.kt
  32. 0 3
      frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/ScrollToEndEvent.kt
  33. 0 5
      frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/ShowLongClickDialogEvent.kt
  34. 3 2
      frame/imkit/src/main/java/com/adealink/frame/imkit/listener/BaseConversationEventListener.kt
  35. 1 1
      frame/imkit/src/main/java/com/adealink/frame/imkit/listener/ConversationEventListener.java
  36. 13 15
      frame/imkit/src/main/java/com/adealink/frame/imkit/manager/AudioPlayManager.java
  37. 12 13
      frame/imkit/src/main/java/com/adealink/frame/imkit/manager/UnReadMessageManager.kt
  38. 0 21
      frame/imkit/src/main/java/com/adealink/frame/imkit/model/MessageBlockRes.kt
  39. 0 5
      frame/imkit/src/main/java/com/adealink/frame/imkit/model/Tags.kt
  40. 9 9
      frame/imkit/src/main/java/com/adealink/frame/imkit/resend/ResendManager.kt
  41. 0 14
      frame/imkit/src/main/java/com/adealink/frame/imkit/userinfo/model/IMUserInfo.kt
  42. 0 234
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/IMDateUtils.java
  43. 0 5
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/IMRouteUtils.java
  44. 0 29
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/IMViewUtils.java
  45. 0 17
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/LogUtil.kt
  46. 0 59
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/RTLUtils.java
  47. 0 129
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/TextViewUtils.java
  48. 0 112
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/ToastUtils.java
  49. 4 4
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/keyboard/KeyboardHeightFloatImpl.kt
  50. 3 3
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/keyboard/KeyboardHeightPopupImpl.kt
  51. 7 7
      frame/imkit/src/main/java/com/adealink/frame/imkit/utils/keyboard/KeyboardHeightProvider.kt
  52. 2 2
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/FixedLinearLayoutManager.kt
  53. 5 1
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/BaseAdapter.kt
  54. 3 2
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/DefaultProvider.kt
  55. 7 1
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/IViewProvider.kt
  56. 5 5
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/ProviderManager.kt
  57. 30 1
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/ViewHolder.kt
  58. 0 566
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/menu/IMSwipeMenuLayout.kt
  59. 0 70
      frame/imkit/src/main/java/com/adealink/frame/imkit/widget/refresh/IMRefreshHeader.java
  60. 136 0
      frame/imkit/src/main/res/values-ar/string.xml
  61. 135 0
      frame/imkit/src/main/res/values-zh/string.xml
  62. 0 5
      frame/imkit/src/main/res/values/ids.xml
  63. 135 0
      frame/imkit/src/main/res/values/string.xml
  64. 0 1
      module/follow/src/main/java/com/adealink/weparty/follow/FriendHomeFragment.kt
  65. 1 0
      module/message/src/main/AndroidManifest.xml
  66. 1 1
      module/message/src/main/java/com/adealink/weparty/message/MessageFragment.kt
  67. 15 0
      module/message/src/main/java/com/adealink/weparty/message/MessageServiceImpl.kt
  68. 2 1
      module/message/src/main/java/com/adealink/weparty/message/config/BaseDataProcessor.kt
  69. 21 17
      module/message/src/main/java/com/adealink/weparty/message/config/ConversationConfig.kt
  70. 6 4
      module/message/src/main/java/com/adealink/weparty/message/config/ConversationListConfig.kt
  71. 1 3
      module/message/src/main/java/com/adealink/weparty/message/config/DefaultConversationListProcessor.kt
  72. 18 0
      module/message/src/main/java/com/adealink/weparty/message/config/IMConfigCenter.kt
  73. 8 4
      module/message/src/main/java/com/adealink/weparty/message/constant/Tags.kt
  74. 32 2
      module/message/src/main/java/com/adealink/weparty/message/conversation/ConversationActivity.kt
  75. 74 92
      module/message/src/main/java/com/adealink/weparty/message/conversation/ConversationFragment.kt
  76. 5 5
      module/message/src/main/java/com/adealink/weparty/message/conversation/MessageListAdapter.kt
  77. 8 2
      module/message/src/main/java/com/adealink/weparty/message/conversation/comp/ConversationTargetInfoComp.kt
  78. 16 4
      module/message/src/main/java/com/adealink/weparty/message/conversation/data/ConversationData.kt
  79. 5 4
      module/message/src/main/java/com/adealink/weparty/message/conversation/data/MessageExpansion.kt
  80. 4 4
      module/message/src/main/java/com/adealink/weparty/message/conversation/data/OfficialMessage.kt
  81. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/data/OfficialMessageRealContent.kt
  82. 1 5
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/ExtensionViewModel.kt
  83. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/IExtensionBoard.kt
  84. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/IExtensionViewModel.kt
  85. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/InputMode.kt
  86. 3 3
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/AndroidEmoji.kt
  87. 5 5
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/EmojiTab.kt
  88. 5 9
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/EmoticonBoard.kt
  89. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmojiItemClickListener.kt
  90. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmoticonClickListener.kt
  91. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmoticonSettingClickListener.kt
  92. 1 1
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmoticonTab.kt
  93. 1 7
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/gallery/GalleryBoardComp.kt
  94. 0 5
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/gallery/select/IQuickImageSelectListener.kt
  95. 13 9
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/inputpanel/ConversationInputPanelFragment.kt
  96. 6 6
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/longclick/MessageItemLongClickAction.kt
  97. 20 28
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/longclick/MessageItemLongClickActionManager.kt
  98. 2 3
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/longclick/MessageItemLongClickBean.kt
  99. 10 10
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/refrence/ReferenceManager.kt
  100. 47 32
      module/message/src/main/java/com/adealink/weparty/message/conversation/extension/refrence/ReferenceMessageItemProvider.kt

+ 0 - 3
app/src/main/java/com/adealink/weparty/App.kt

@@ -69,9 +69,7 @@ import com.adealink.weparty.deviceidservice.TCTuringConfig
 import com.adealink.weparty.download.DownloadConfig
 import com.adealink.weparty.effect.EffectConfig
 import com.adealink.weparty.googleservice.GoogleServiceConfig
-import com.adealink.weparty.im.IIMConnectManager
 import com.adealink.weparty.im.IMConfig
-import com.adealink.weparty.im.IMConnectManager
 import com.adealink.weparty.image.ImageConfig
 import com.adealink.weparty.json.JsonConfig
 import com.adealink.weparty.locale.LanguageConfig
@@ -150,7 +148,6 @@ class App : SplitCompatApplication(), ActivityLifecycleCallbacksExt {
     val database by lazy {
         Room.databaseBuilder(applicationContext, AppDatabase::class.java, "weparty_app_db").build()
     }
-    val imConnectManager: IIMConnectManager by lazy { IMConnectManager() }
     val imService by lazy { IMService.create(IMConfig()) }
 
     var appStartTime = 0L

+ 22 - 14
app/src/main/java/com/adealink/weparty/commonui/widget/floatview/view/SwipeToTopConstraintLayout.kt

@@ -32,6 +32,7 @@ open class SwipeToTopConstraintLayout @JvmOverloads constructor(
     private var hideMode = HideMode.MODE_AUTO
     private var onHideListener: ((mode: HideMode) -> Unit)? = null
     private var touchDispatchEventListener: ITouchDispatchEventListener? = null
+    private var isClick = false // 标志是否是点击事件
 
     companion object{
         const val DEFAULT_DELAY_TIME = 5000L
@@ -61,6 +62,7 @@ open class SwipeToTopConstraintLayout @JvmOverloads constructor(
                 initialTranslationY = translationY
                 lastTranslationY = initialTranslationY
                 isAnimating = false
+                isClick = true // 初始认为是点击事件
                 return true
             }
 
@@ -71,6 +73,7 @@ open class SwipeToTopConstraintLayout @JvmOverloads constructor(
 
                 val deltaY = event.y - lastY
                 if (Math.abs(deltaY) > moveThreshold) {
+                    isClick = false // 如果有滑动,则不是点击事件
                     // 使用平滑因子来平滑 deltaY
                     val smoothedDeltaY = deltaY * smoothFactor
                     val newTranslationY = lastTranslationY + smoothedDeltaY
@@ -96,22 +99,27 @@ open class SwipeToTopConstraintLayout @JvmOverloads constructor(
                 if (isAnimating) {
                     return true
                 }
-                // 计算向上滑动的距离
-                val totalSlideDistance = initialTranslationY - translationY
-
-                if (totalSlideDistance > hideThreshold) {
-                    // 如果滑动距离超过阈值,滑出屏幕并隐藏视图
-                    hideView(HideMode.MODE_MANUAL)
+                if (isClick) {
+                    // 如果是点击事件,触发跳转逻辑
+                    performClick()
                 } else {
-                    // 否则执行回弹动画
-                    animator?.cancel()
-                    animator = ValueAnimator.ofFloat(translationY, initialTranslationY).apply {
-                        duration = 300
-                        interpolator = DecelerateInterpolator() // 添加插值器来平滑动画
-                        addUpdateListener {
-                            translationY = it.animatedValue as Float
+                    // 计算向上滑动的距离
+                    val totalSlideDistance = initialTranslationY - translationY
+
+                    if (totalSlideDistance > hideThreshold) {
+                        // 如果滑动距离超过阈值,滑出屏幕并隐藏视图
+                        hideView(HideMode.MODE_MANUAL)
+                    } else {
+                        // 否则执行回弹动画
+                        animator?.cancel()
+                        animator = ValueAnimator.ofFloat(translationY, initialTranslationY).apply {
+                            duration = 300
+                            interpolator = DecelerateInterpolator() // 添加插值器来平滑动画
+                            addUpdateListener {
+                                translationY = it.animatedValue as Float
+                            }
+                            start()
                         }
-                        start()
                     }
                 }
                 isAnimating = true

+ 0 - 65
app/src/main/java/com/adealink/weparty/im/IMConfig.kt

@@ -1,72 +1,7 @@
 package com.adealink.weparty.im
 
-import android.util.Log
-import com.adealink.frame.coroutine.dispatcher.Dispatcher
 import com.adealink.frame.imkit.config.IIMConfig
-import com.adealink.frame.imkit.userinfo.UserDataProvider
-import com.adealink.frame.imkit.userinfo.model.IMUserInfo
-import com.adealink.frame.log.ILog
-import com.adealink.frame.util.AppUtil
-import com.adealink.weparty.App
-import com.adealink.weparty.commonui.ext.onSuccess
-import com.adealink.weparty.module.profile.ProfileModule
-import com.adealink.weparty.module.profile.view.UserNameTextView.Companion.getDisplayName
-import com.adealink.weparty.util.goLocalLinkPage
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.launch
 
 class IMConfig: IIMConfig {
     override val appKey: String = "vnroth0kv2woo"
-    override val logger: ILog = object: ILog {
-        override fun logD(tag: String, msg: String) {
-            Log.d(tag, msg)
-        }
-
-        override fun logE(tag: String, msg: String, e: Exception?) {
-            Log.e(tag, msg)
-        }
-
-        override fun logI(tag: String, msg: String) {
-            Log.i(tag, msg)
-        }
-    }
-    override val userInfoProvider: UserDataProvider.UserInfoProvider
-        get() = object : UserDataProvider.UserInfoProvider {
-            override fun getUserInfo(userId: String?): IMUserInfo? {
-                val uid = userId?.toLongOrNull() ?: return null
-                val userInfo = ProfileModule.getCacheUserInfo(uid)
-                if (userInfo == null) {
-                    CoroutineScope(Dispatcher.WENEXT_THREAD_POOL).launch {
-                        val userInfoRlt = ProfileModule.getUserInfoByUid(uid)
-                        userInfoRlt.onSuccess {
-                            App.instance.imService.refreshUserInfo(IMUserInfo(
-                                id = it.uid.toString(),
-                                name = getDisplayName(it.uid, it.name),
-                                avatarUrl = it.url,
-                                flag = it.flag,
-                                userInfo = it
-                            ))
-                        }
-                    }
-                    return null
-                }
-                return IMUserInfo(
-                    id = userInfo.uid.toString(),
-                    name = getDisplayName(userInfo.uid, userInfo.name),
-                    avatarUrl = userInfo.url,
-                    flag = userInfo.flag,
-                    userInfo = userInfo
-                )
-            }
-        }
-
-    override fun getAppLanguageCode(): String {
-        return App.instance.languageManager.getLanguageCode()
-    }
-
-    override fun routeUrl(url: String) {
-        val currentActivity = AppUtil.currentActivity ?: return
-        goLocalLinkPage(currentActivity, url)
-    }
-
 }

+ 4 - 0
app/src/main/java/com/adealink/weparty/module/message/IMessageService.kt

@@ -3,10 +3,14 @@ package com.adealink.weparty.module.message
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.IService
 import com.adealink.frame.base.Rlt
+import com.adealink.weparty.commonui.widget.floatview.data.IBaseFloatData
+import com.adealink.weparty.commonui.widget.floatview.view.BaseFloatView
 import com.adealink.weparty.module.message.viewmodel.IMessageViewModel
 
 interface IMessageService : IService<IMessageService> {
+    fun init()
     fun getMessageViewModel(owner: ViewModelStoreOwner): IMessageViewModel?
     suspend fun batchGetFirstChatTs(uidSet: Set<Long>): Rlt<Map<Long, Long>>
+    fun getNewMessageFloatView(data: IBaseFloatData): BaseFloatView?
     fun logout()
 }

+ 17 - 0
app/src/main/java/com/adealink/weparty/module/message/MessageModule.kt

@@ -5,6 +5,8 @@ import com.adealink.frame.aab.BaseDynamicModule
 import com.adealink.frame.aab.constant.AABModuleNotInitError
 import com.adealink.frame.base.Rlt
 import com.adealink.weparty.R
+import com.adealink.weparty.commonui.widget.floatview.data.IBaseFloatData
+import com.adealink.weparty.commonui.widget.floatview.view.BaseFloatView
 import com.adealink.weparty.module.message.viewmodel.IMessageViewModel
 
 object MessageModule : BaseDynamicModule<IMessageService>(IMessageService::class), IMessageService {
@@ -15,6 +17,10 @@ object MessageModule : BaseDynamicModule<IMessageService>(IMessageService::class
     override val moduleNameResId: Int
         get() = R.string.module_message
 
+    override fun init() {
+        getService().init()
+    }
+
     override fun getMessageViewModel(owner: ViewModelStoreOwner): IMessageViewModel? {
         return getService().getMessageViewModel(owner)
     }
@@ -23,6 +29,9 @@ object MessageModule : BaseDynamicModule<IMessageService>(IMessageService::class
         return getService().batchGetFirstChatTs(uidSet)
     }
 
+    override fun getNewMessageFloatView(data: IBaseFloatData): BaseFloatView? {
+        return getService().getNewMessageFloatView(data)
+    }
 
     override fun logout() {
         getService().logout()
@@ -31,6 +40,10 @@ object MessageModule : BaseDynamicModule<IMessageService>(IMessageService::class
     override fun emptyService(): IMessageService {
 
         return object : IMessageService {
+            override fun init() {
+
+            }
+
             override fun getMessageViewModel(owner: ViewModelStoreOwner): IMessageViewModel? {
                 return null
             }
@@ -39,6 +52,10 @@ object MessageModule : BaseDynamicModule<IMessageService>(IMessageService::class
                 return Rlt.Failed(AABModuleNotInitError())
             }
 
+            override fun getNewMessageFloatView(data: IBaseFloatData): BaseFloatView? {
+                return null
+            }
+
             override fun logout() {
 
             }

+ 1 - 0
app/src/main/java/com/adealink/weparty/module/message/Router.kt

@@ -52,6 +52,7 @@ interface Message {
             const val PATH = "/conversation"
             const val LIST = "/conversation_list"
             const val FRAGMENT = "${PATH}/fragment"
+            const val FRAGMENT_TAG = "ConversationFragment"
             const val SETTING = "${PATH}/setting"
             const val MODIFY_REMARK_DESC = "${PATH}/modify_remark_desc"
         }

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/model/TargetIdExt.kt → app/src/main/java/com/adealink/weparty/module/message/data/TargetIdExt.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.model
+package com.adealink.weparty.module.message.data
 
 
 const val OFFICIAL_TARGET_ID = 1L

+ 1 - 1
app/src/main/java/com/adealink/weparty/module/message/dot/MessageDot.kt

@@ -4,9 +4,9 @@ import com.adealink.frame.base.Rlt
 import com.adealink.frame.dot.Dot
 import com.adealink.frame.dot.NumDot
 import com.adealink.frame.imkit.manager.UnReadMessageManager
-import com.adealink.frame.imkit.model.OFFICIAL_TARGET_ID
 import com.adealink.weparty.App
 import com.adealink.weparty.module.family.FamilyModule
+import com.adealink.weparty.module.message.data.OFFICIAL_TARGET_ID
 import io.rong.imlib.model.Conversation
 import kotlinx.coroutines.launch
 

+ 1 - 1
app/src/main/java/com/adealink/weparty/module/message/dot/NormalMessageDot.kt

@@ -5,8 +5,8 @@ import com.adealink.frame.dot.Dot
 import com.adealink.frame.dot.NormalDot
 import com.adealink.frame.dot.NumDot
 import com.adealink.frame.imkit.manager.UnReadMessageManager
-import com.adealink.frame.imkit.model.OFFICIAL_TARGET_ID
 import com.adealink.weparty.App
+import com.adealink.weparty.module.message.data.OFFICIAL_TARGET_ID
 import io.rong.imlib.model.Conversation
 import kotlinx.coroutines.launch
 

+ 9 - 3
app/src/main/java/com/adealink/weparty/module/message/view/SocialAvatarDecorView.kt

@@ -15,15 +15,21 @@ class SocialAvatarDecorView @JvmOverloads constructor(
     val binding: LayoutSocialAvatarDecorBinding = LayoutSocialAvatarDecorBinding.inflate(LayoutInflater.from(context), this)
     var status: OnlineInRoomStatus? = null
 
-    fun setOnlineInRoomStatus(status: OnlineInRoomStatus) {
+    fun setOnlineInRoomStatus(status: OnlineInRoomStatus?) {
         this.status = status
+        if (status == null) {
+            binding.svgaInRoom.gone()
+            binding.ivOnline.gone()
+            return
+        }
         val roomId = status.inRoomId
         if (roomId != null) {
-            binding.inRoomCl.show()
+            binding.svgaInRoom.show()
+            binding.svgaInRoom.setAsset("home_user_in_room.svga")
             binding.ivOnline.gone()
             return
         }
-        binding.inRoomCl.gone()
+        binding.svgaInRoom.gone()
         if (status.isOnline) {
             binding.ivOnline.show()
         } else {

+ 4 - 1
app/src/main/java/com/adealink/weparty/module/profile/IProfileService.kt

@@ -3,6 +3,7 @@ package com.adealink.weparty.module.profile
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.IService
 import com.adealink.frame.base.Rlt
+import com.adealink.weparty.module.profile.data.OnlineInRoomStatus
 import com.adealink.weparty.module.profile.data.UserConfigType
 import com.adealink.weparty.module.profile.data.UserInfo
 import com.adealink.weparty.module.profile.data.UserInfo.Companion.NECESSARY_USER_ATTR_SET
@@ -44,7 +45,7 @@ interface IProfileService : IService<IProfileService> {
         attrSet: Set<UserConfigType>? = NECESSARY_USER_ATTR_SET,
     ): Rlt<Map<Long, UserInfo>>
 
-    suspend fun getUsersInRoomStatus(uidSet: Set<Long>): Rlt<Map<Long, Long>>
+    suspend fun getUsersInRoomStatus(uidSet: Set<Long>, cache: Boolean = false): Rlt<Map<Long, Long>>
 
     suspend fun getUserInfoByGoodOrShortId(id: String): Rlt<UserInfo>
 
@@ -101,6 +102,8 @@ interface IProfileService : IService<IProfileService> {
 
     fun pullUserNoteNameData()
 
+    suspend fun getUsersOnlineInRoomStatus(uids: Set<Long>): Map<Long, OnlineInRoomStatus>
+
     fun registerListener(listener: IProfileListener)
     fun unregisterListener(listener: IProfileListener)
 }

+ 20 - 4
app/src/main/java/com/adealink/weparty/module/profile/ProfileModule.kt

@@ -2,9 +2,11 @@ package com.adealink.weparty.module.profile
 
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.aab.BaseDynamicModule
+import com.adealink.frame.aab.constant.AABModuleNotInitError
 import com.adealink.frame.base.IError
 import com.adealink.frame.base.Rlt
 import com.adealink.weparty.R
+import com.adealink.weparty.module.profile.data.OnlineInRoomStatus
 import com.adealink.weparty.module.profile.data.UserConfigType
 import com.adealink.weparty.module.profile.data.UserInfo
 import com.adealink.weparty.module.profile.decorate.data.DecorInfo
@@ -68,8 +70,11 @@ object ProfileModule : BaseDynamicModule<IProfileService>(IProfileService::class
                 return Rlt.Failed(IError())
             }
 
-            override suspend fun getUsersInRoomStatus(uidSet: Set<Long>): Rlt<Map<Long, Long>> {
-                return Rlt.Failed(IError())
+            override suspend fun getUsersInRoomStatus(
+                uidSet: Set<Long>,
+                cache: Boolean
+            ): Rlt<Map<Long, Long>> {
+                return Rlt.Failed(AABModuleNotInitError())
             }
 
             override suspend fun getUserInfoByGoodOrShortId(id: String): Rlt<UserInfo> {
@@ -176,6 +181,10 @@ object ProfileModule : BaseDynamicModule<IProfileService>(IProfileService::class
             override fun pullUserNoteNameData() {
             }
 
+            override suspend fun getUsersOnlineInRoomStatus(uids: Set<Long>): Map<Long, OnlineInRoomStatus> {
+                return emptyMap()
+            }
+
             override fun registerListener(listener: IProfileListener) {
             }
 
@@ -220,8 +229,11 @@ object ProfileModule : BaseDynamicModule<IProfileService>(IProfileService::class
         return getService().getUsersInfoByUid(uidSet, cache, attrSet)
     }
 
-    override suspend fun getUsersInRoomStatus(uidSet: Set<Long>): Rlt<Map<Long, Long>> {
-        return getService().getUsersInRoomStatus(uidSet)
+    override suspend fun getUsersInRoomStatus(
+        uidSet: Set<Long>,
+        cache: Boolean
+    ): Rlt<Map<Long, Long>> {
+        return getService().getUsersInRoomStatus(uidSet, cache)
     }
 
     override suspend fun getUserInfoByGoodOrShortId(id: String): Rlt<UserInfo> {
@@ -323,6 +335,10 @@ object ProfileModule : BaseDynamicModule<IProfileService>(IProfileService::class
         return getService().pullUserNoteNameData()
     }
 
+    override suspend fun getUsersOnlineInRoomStatus(uids: Set<Long>): Map<Long, OnlineInRoomStatus> {
+        return getService().getUsersOnlineInRoomStatus(uids)
+    }
+
     override fun registerListener(listener: IProfileListener) {
         return getService().registerListener(listener)
     }

+ 2 - 1
app/src/main/java/com/adealink/weparty/module/profile/viewmodel/IProfileViewModel.kt

@@ -20,6 +20,7 @@ interface IProfileViewModel {
     val getUserInRoomStatusRltLD: LiveData<Rlt<Map<Long, Long>>>//first:操作uid,second:roomId
     val enableChangeRegionLD: LiveData<Boolean>
     val gifAvatar: LiveData<GifAvatarLastLevel>
+    val remarkAndDescResLD: LiveData<RemarkAndDescRes>
 
     fun getUidUserInfo(
         uid: Long,
@@ -82,5 +83,5 @@ interface IProfileViewModel {
         voiceDuration: Int
     ): LiveData<Rlt<Any>>
 
-    fun getUsersOnlineInRoomStatus(uids: List<Long>): LiveData<Map<Long, OnlineInRoomStatus>>
+    fun getUsersOnlineInRoomStatus(uids: Set<Long>): LiveData<Map<Long, OnlineInRoomStatus>>
 }

+ 0 - 7
app/src/main/java/com/adealink/weparty/token/Data.kt

@@ -4,10 +4,3 @@ import com.google.gson.annotations.JsonAdapter
 import com.google.gson.annotations.SerializedName
 import com.google.gson.internal.bind.ExtReflectiveTypeAdapterFactory
 
-@JsonAdapter(ExtReflectiveTypeAdapterFactory::class)
-data class TokenResData(
-    @SerializedName("token")
-    val token: String,
-    @SerializedName("uid")
-    val uid: Long
-)

+ 0 - 11
app/src/main/java/com/adealink/weparty/token/TokenHttpService.kt

@@ -1,13 +1,2 @@
 package com.adealink.weparty.token
 
-import com.adealink.frame.base.Rlt
-import com.adealink.frame.network.data.Res
-import retrofit2.http.GET
-import retrofit2.http.Query
-
-interface TokenHttpService {
-    @GET("im/get_rong_cloud_token")
-    suspend fun getIMToken(
-        @Query("uid") uid : Long,
-    ): Rlt<Res<TokenResData>>
-}

+ 2 - 2
app/src/main/java/com/adealink/weparty/ui/home/BaseHomeFragment.kt

@@ -13,7 +13,6 @@ import com.adealink.frame.log.Log
 import com.adealink.frame.router.Router
 import com.adealink.frame.util.removeUiCallbacks
 import com.adealink.frame.util.runOnUiThread
-import com.adealink.weparty.App
 import com.adealink.weparty.R
 import com.adealink.weparty.commonui.BaseFragment
 import com.adealink.weparty.commonui.dialogfragment.BaseDialogFragment
@@ -40,6 +39,7 @@ import com.adealink.weparty.module.level.data.TAG_LEVEL
 import com.adealink.weparty.module.medal.Medal
 import com.adealink.weparty.module.medal.MedalModule
 import com.adealink.weparty.module.medal.data.MedalData
+import com.adealink.weparty.module.message.MessageModule
 import com.adealink.weparty.module.operation.Operation
 import com.adealink.weparty.module.operation.OperationModule
 import com.adealink.weparty.module.profile.ProfileModule
@@ -149,8 +149,8 @@ abstract class BaseHomeFragment : BaseFragment, ITabManager {
 
     @CallSuper
     open fun importantLoad() {
-        App.instance.imConnectManager.init()
         AccountModule.refreshToken()
+        MessageModule.init()
         roomAttrViewModel?.getMyRoomInfo(true)
         anchorViewModel?.getAnchorMessages()
         OperationModule.checkSuperSupporterWhatsAppFillStatus()

+ 5 - 0
app/src/main/java/com/adealink/weparty/ui/home/util/HomeUIUtil.kt

@@ -11,4 +11,9 @@ object HomeUIUtil {
         val currentActivity = AppUtil.currentActivity ?: return false
         return currentActivity is MainActivity && selectedHomeTab == HomeTab.ME
     }
+
+    fun isInMessageTab(): Boolean {
+        val currentActivity = AppUtil.currentActivity ?: return false
+        return currentActivity is MainActivity && selectedHomeTab == HomeTab.MESSAGE
+    }
 }

+ 3 - 1
app/src/main/java/com/adealink/weparty/widget/floatview/FloatViewFactory.kt

@@ -5,7 +5,7 @@ import com.adealink.weparty.commonui.widget.floatview.data.IFloatViewFactory
 import com.adealink.weparty.commonui.widget.floatview.view.BaseFloatView
 import com.adealink.weparty.module.couple.CoupleModule
 import com.adealink.weparty.module.follow.FollowModule
-import com.adealink.weparty.module.level.LevelModule
+import com.adealink.weparty.module.message.MessageModule
 import com.adealink.weparty.module.room.RoomModule
 import com.adealink.weparty.module.wallet.WalletModule
 import com.adealink.weparty.network.view.NetworkReconnectFloatView
@@ -22,6 +22,7 @@ class FloatViewFactory : IFloatViewFactory {
         const val PURCHASE_COIN_NOTIFY = "purchase_coin_notify"
         const val WEDDING_RED_PACKET_HEADLINE = "wedding_red_packet_headline"
         const val SPECIAL_FOLLOW_ONLINE_NOTIFY = "special_follow_online_notify"
+        const val NEW_MESSAGE = "new_message"
     }
 
     override fun createFloatView(data: IBaseFloatData): BaseFloatView? {
@@ -32,6 +33,7 @@ class FloatViewFactory : IFloatViewFactory {
             PURCHASE_COIN_NOTIFY -> WalletModule.getPurchaseCoinFloatView(data)
             WEDDING_RED_PACKET_HEADLINE -> RoomModule.getWeddingRedPacketFloatView(data)
             SPECIAL_FOLLOW_ONLINE_NOTIFY -> FollowModule.getSpecialFollowOnlineFloatView(data)
+            NEW_MESSAGE -> MessageModule.getNewMessageFloatView(data)
             else -> null
         }
     }

+ 3 - 20
app/src/main/res/layout/layout_social_avatar_decor.xml

@@ -19,27 +19,10 @@
         app:layout_constraintTop_toTopOf="parent"
         app:layout_constraintEnd_toEndOf="parent"/>
 
-    <FrameLayout
-        android:id="@+id/in_room_cl"
+    <com.opensource.svgaplayer.WenextSvgaView
+        android:id="@+id/svga_in_room"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:visibility="gone"
-        tools:visibility="visible">
-
-        <androidx.appcompat.widget.AppCompatImageView
-            android:id="@+id/iv_in_room_fg"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:layout_gravity="center"
-            android:background="@drawable/ic_in_room_avatar_border_fg" />
-
-        <androidx.appcompat.widget.AppCompatImageView
-            android:id="@+id/iv_in_room"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:layout_gravity="center"
-            android:background="@drawable/ic_in_room_avatar_border" />
-
-    </FrameLayout>
+        android:layout_gravity="center"/>
 
 </merge>

+ 1 - 7
frame/imkit/build.gradle

@@ -58,17 +58,11 @@ dependencies {
     compileOnly platform(libs.frame.bom)
     compileOnly libs.frame.base
     compileOnly libs.frame.util
-    compileOnly libs.frame.image
-    compileOnly libs.frame.drawee
     compileOnly libs.frame.coroutine
-    compileOnly libs.frame.mvvm
     compileOnly libs.frame.aab
     compileOnly libs.frame.zero
     compileOnly libs.frame.data
-    implementation libs.smart.refresh.layout.kernel
-    implementation libs.smart.refresh.header.material
-    implementation libs.smart.refresh.footer.classics
-
+    compileOnly libs.frame.log
 
     //test
     testImplementation libs.junit

+ 33 - 100
frame/imkit/src/main/java/com/adealink/frame/imkit/IMService.kt

@@ -3,6 +3,7 @@ package com.adealink.frame.imkit
 import android.app.Application
 import android.text.TextUtils
 import com.adealink.frame.imkit.config.IIMConfig
+import com.adealink.frame.imkit.config.MessageInterceptor
 import com.adealink.frame.imkit.event.actionevent.ClearEvent
 import com.adealink.frame.imkit.event.actionevent.DeleteEvent
 import com.adealink.frame.imkit.event.actionevent.InsertEvent
@@ -11,17 +12,14 @@ import com.adealink.frame.imkit.event.actionevent.RecallEvent
 import com.adealink.frame.imkit.event.actionevent.RefreshEvent
 import com.adealink.frame.imkit.event.actionevent.SendEvent
 import com.adealink.frame.imkit.event.actionevent.SendMediaEvent
+import com.adealink.frame.imkit.listener.ConversationEventListener
 import com.adealink.frame.imkit.manager.UnReadMessageManager
-import com.adealink.frame.imkit.model.OfficialMessage
 import com.adealink.frame.imkit.model.TAG_IM_MSG_BLOCK
 import com.adealink.frame.imkit.model.TAG_IM_MSG_EXPANSION
 import com.adealink.frame.imkit.model.TAG_IM_SERVICE
 import com.adealink.frame.imkit.resend.ResendManager
-import com.adealink.frame.imkit.userinfo.IMUserInfoManager
-import com.adealink.frame.imkit.userinfo.model.IMUserInfo
 import com.adealink.frame.imkit.utils.ExecutorHelper
-import com.adealink.frame.imkit.utils.LogUtil
-import com.adealink.frame.util.AppUtil
+import com.adealink.frame.log.Log
 import io.rong.common.SystemUtils
 import io.rong.imlib.ChannelClient
 import io.rong.imlib.IRongCallback
@@ -46,7 +44,6 @@ import io.rong.imlib.model.Message.SentStatus
 import io.rong.imlib.model.MessageContent
 import io.rong.imlib.model.ReceivedProfile
 import io.rong.imlib.model.SendMessageOption
-import io.rong.message.InformationNotificationMessage
 import io.rong.message.ReadReceiptMessage
 import io.rong.message.RecallNotificationMessage
 import io.rong.message.SightMessage
@@ -108,7 +105,7 @@ class IMService(val config: IIMConfig) {
                         profile.isOffline
                     ) == true
                 ) {
-                    LogUtil.d(TAG_IM_SERVICE, "message has been intercepted.")
+                    Log.d(TAG_IM_SERVICE, "message has been intercepted.")
                     return
                 }
 
@@ -216,7 +213,7 @@ class IMService(val config: IIMConfig) {
      */
     private val messageBlockListener: IRongCoreListener.MessageBlockListener =
         IRongCoreListener.MessageBlockListener { info ->
-            LogUtil.e(TAG_IM_MSG_BLOCK, "$info")
+            Log.e(TAG_IM_MSG_BLOCK, "$info")
             for (item in messageBlockListeners) {
                 item.onMessageBlock(info)
             }
@@ -231,7 +228,7 @@ class IMService(val config: IIMConfig) {
                 expansion: Map<String, String>?,
                 message: Message?
             ) {
-                LogUtil.d(TAG_IM_MSG_EXPANSION, "onMessageExpansionUpdate, expansion:$expansion, messageId${message?.messageId}")
+                Log.d(TAG_IM_MSG_EXPANSION, "onMessageExpansionUpdate, expansion:$expansion, messageId${message?.messageId}")
                 for (item in messageExpansionListeners) {
                     item.onMessageExpansionUpdate(expansion, message)
                 }
@@ -241,7 +238,7 @@ class IMService(val config: IIMConfig) {
                 keyArray: MutableList<String>?,
                 message: Message?
             ) {
-                LogUtil.d(TAG_IM_MSG_EXPANSION, "onMessageExpansionRemove, removeKeyArray:$keyArray, messageId${message?.messageId}")
+                Log.d(TAG_IM_MSG_EXPANSION, "onMessageExpansionRemove, removeKeyArray:$keyArray, messageId${message?.messageId}")
                 for (item in messageExpansionListeners) {
                     item.onMessageExpansionRemove(keyArray, message)
                 }
@@ -260,15 +257,15 @@ class IMService(val config: IIMConfig) {
     fun init(application: Application?, option: InitOption?) {
         var opt = option
         if (application == null) {
-            LogUtil.e(TAG_IM_SERVICE, "init error: application is null")
+            Log.e(TAG_IM_SERVICE, "init error: application is null")
             return
         }
         if (TextUtils.isEmpty(config.appKey)) {
-            LogUtil.e(TAG_IM_SERVICE, "init error: appKey is null")
+            Log.e(TAG_IM_SERVICE, "init error: appKey is null")
             return
         }
         if (option == null) {
-            LogUtil.d(TAG_IM_SERVICE, "init warn: option is null")
+            Log.d(TAG_IM_SERVICE, "init warn: option is null")
             opt = InitOption.Builder().build()
         }
         isInit = true
@@ -277,11 +274,11 @@ class IMService(val config: IIMConfig) {
             val current = SystemUtils.getCurrentProcessName(application)
             val mainProcessName = application.packageName
             if (mainProcessName != current) {
-                LogUtil.d(TAG_IM_SERVICE, "Init. Current process : $current")
+                Log.d(TAG_IM_SERVICE, "Init. Current process : $current")
                 return
             }
         } else if (option.isMainProcess == false) {
-            LogUtil.d(TAG_IM_SERVICE, "Init. isMainProcess : Boolean.FALSE")
+            Log.d(TAG_IM_SERVICE, "Init. isMainProcess : Boolean.FALSE")
             return
         }
         RongCoreClient.addOnReceiveMessageListener(onReceiveMessageListener)
@@ -292,7 +289,13 @@ class IMService(val config: IIMConfig) {
         RongIMClient.getInstance().setSyncConversationReadStatusListener(syncConversationReadStatusListener)
         RongIMClient.getInstance().setMessageBlockListener(messageBlockListener)
         RongIMClient.getInstance().setMessageExpansionListener(messageExpansionListener)
-        IMUserInfoManager.setUserInfoProvider(config.userInfoProvider)
+    }
+
+    /**
+     * 建立连接前,注册自定义消息,否则sdk无法识别
+     */
+    fun registerMessageType(messageContentClassList: List<Class<out MessageContent>>) {
+        RongIMClient.registerMessageType(messageContentClassList)
     }
 
     /**
@@ -314,8 +317,6 @@ class IMService(val config: IIMConfig) {
     fun connect(
         token: String?, timeLimit: Int, connectCallback: RongIMClient.ConnectCallback? = null
     ) {
-        //建立连接前,注册自定义消息,否则sdk无法识别
-        RongIMClient.registerMessageType(listOf(SightMessage::class.java, OfficialMessage::class.java))
         val connectOption = ConnectOption.obtain(token, timeLimit)
         connect(connectOption, connectCallback)
     }
@@ -341,7 +342,7 @@ class IMService(val config: IIMConfig) {
                             callback.onSuccess(s)
                         }
                     } else {
-                        LogUtil.e(TAG_IM_SERVICE, "IM connect success but userId is empty.")
+                        Log.e(TAG_IM_SERVICE, "IM connect success but userId is empty.")
                     }
                 }
 
@@ -714,7 +715,7 @@ class IMService(val config: IIMConfig) {
         callback: IRongCallback.ISendMessageCallback?
     ) {
         if (messageInterceptor != null && messageInterceptor?.interceptOnSendMessage(message) == true) {
-            LogUtil.d(TAG_IM_SERVICE, "message has been intercepted.")
+            Log.d(TAG_IM_SERVICE, "message has been intercepted.")
             return
         }
         handleBeforeSend(message)
@@ -738,7 +739,7 @@ class IMService(val config: IIMConfig) {
                         if (messageInterceptor != null
                             && messageInterceptor?.interceptOnSentMessage(message) == true
                         ) {
-                            LogUtil.d(TAG_IM_SERVICE, "message has been intercepted.")
+                            Log.d(TAG_IM_SERVICE, "message has been intercepted.")
                             return
                         }
                         for (item in messageEventListeners) {
@@ -791,77 +792,13 @@ class IMService(val config: IIMConfig) {
         listener: FilterSentListener?
     ) {
         if (message == null) {
-            LogUtil.e(TAG_IM_SERVICE, "filterSentMessage message is null")
+            Log.e(TAG_IM_SERVICE, "filterSentMessage message is null")
             listener?.onComplete()
             return
         }
-        if (errorCode != null
-            && errorCode.value
-            != CoreErrorCode.RC_MSG_REPLACED_SENSITIVE_WORD.value
-        ) {
-            if (errorCode.value == CoreErrorCode.NOT_IN_DISCUSSION.value || errorCode.value == CoreErrorCode.NOT_IN_GROUP.value || (errorCode.value
-                        == CoreErrorCode.NOT_IN_CHATROOM.value) || (errorCode.value
-                        == CoreErrorCode.REJECTED_BY_BLACKLIST.value) || (errorCode.value
-                        == CoreErrorCode.FORBIDDEN_IN_GROUP.value) || (errorCode.value
-                        == CoreErrorCode.FORBIDDEN_IN_CHATROOM.value) || (errorCode.value
-                        == CoreErrorCode.KICKED_FROM_CHATROOM.value)
-            ) {
-                if (message.content is ReadReceiptMessage) {
-                    return
-                }
-                var informationMessage: InformationNotificationMessage? = null
-                if (errorCode.value == RongIMClient.ErrorCode.NOT_IN_DISCUSSION.value) {
-                    informationMessage =
-                        InformationNotificationMessage.obtain(
-                            AppUtil.appContext.getString(R.string.rc_info_not_in_discussion)
-                        )
-                } else if (errorCode.value == CoreErrorCode.NOT_IN_GROUP.value) {
-                    informationMessage =
-                        InformationNotificationMessage.obtain(
-                            AppUtil.appContext.getString(R.string.rc_info_not_in_group)
-                        )
-                } else if (errorCode.value == CoreErrorCode.NOT_IN_CHATROOM.value) {
-                    informationMessage =
-                        InformationNotificationMessage.obtain(
-                            AppUtil.appContext.getString(R.string.rc_info_not_in_chatroom)
-                        )
-                } else if (errorCode.value == CoreErrorCode.REJECTED_BY_BLACKLIST.value) {
-                    informationMessage =
-                        InformationNotificationMessage.obtain(
-                            AppUtil.appContext.getString(R.string.rc_rejected_by_blacklist_prompt)
-                        )
-                } else if (errorCode.value == CoreErrorCode.FORBIDDEN_IN_GROUP.value) {
-                    informationMessage =
-                        InformationNotificationMessage.obtain(
-                            AppUtil.appContext.getString(R.string.rc_info_forbidden_to_talk)
-                        )
-                } else if (errorCode.value == CoreErrorCode.FORBIDDEN_IN_CHATROOM.value) {
-                    informationMessage =
-                        InformationNotificationMessage.obtain(
-                            AppUtil.appContext.getString(R.string.rc_forbidden_in_chatroom)
-                        )
-                } else if (errorCode.value == CoreErrorCode.KICKED_FROM_CHATROOM.value) {
-                    informationMessage =
-                        InformationNotificationMessage.obtain(
-                            AppUtil.appContext.getString(R.string.rc_kicked_from_chatroom)
-                        )
-                }
-
-                val receivedStatus =
-                    ReceivedStatus(0)
-                insertIncomingMessage(
-                    message.conversationType,
-                    message.targetId,
-                    message.senderUserId,
-                    receivedStatus,
-                    informationMessage,
-                    null
-                )
-            }
-        }
         val content = message.content
         if (content == null) {
-            LogUtil.e(TAG_IM_SERVICE, "filterSentMessage content is null")
+            Log.e(TAG_IM_SERVICE, "filterSentMessage content is null")
             listener?.onComplete()
             return
         }
@@ -929,7 +866,7 @@ class IMService(val config: IIMConfig) {
                 type, targetId, senderId, receivedStatus, content, time
             ) == true
         ) {
-            LogUtil.d(TAG_IM_SERVICE, "message insertIncoming has been intercepted.")
+            Log.d(TAG_IM_SERVICE, "message insertIncoming has been intercepted.")
             return
         }
         RongIMClient.getInstance()
@@ -986,7 +923,7 @@ class IMService(val config: IIMConfig) {
         callback: IRongCallback.ISendMediaMessageCallback?
     ) {
         if (messageInterceptor != null && messageInterceptor?.interceptOnSendMessage(message) == true) {
-            LogUtil.d(TAG_IM_SERVICE, "message has been intercepted.")
+            Log.d(TAG_IM_SERVICE, "message has been intercepted.")
             return
         }
         handleBeforeSend(message)
@@ -1031,7 +968,7 @@ class IMService(val config: IIMConfig) {
                         filterSentMessage(message, null, null)
                         callback?.onSuccess(message)
                         if (messageInterceptor?.interceptOnSentMessage(message) == true) {
-                            LogUtil.d(TAG_IM_SERVICE, "message has been intercepted.")
+                            Log.d(TAG_IM_SERVICE, "message has been intercepted.")
                             return
                         }
                         for (item in messageEventListeners) {
@@ -1083,7 +1020,7 @@ class IMService(val config: IIMConfig) {
         callback: IRongCallback.ISendMediaMessageCallbackWithUploader?
     ) {
         if (messageInterceptor != null && messageInterceptor?.interceptOnSendMessage(message) == true) {
-            LogUtil.d(TAG_IM_SERVICE, "message has been intercepted.")
+            Log.d(TAG_IM_SERVICE, "message has been intercepted.")
             return
         }
         handleBeforeSend(message)
@@ -1137,7 +1074,7 @@ class IMService(val config: IIMConfig) {
                     if (messageInterceptor != null
                         && messageInterceptor?.interceptOnSentMessage(message) == true
                     ) {
-                        LogUtil.d(TAG_IM_SERVICE, "message has been intercepted.")
+                        Log.d(TAG_IM_SERVICE, "message has been intercepted.")
                         return
                     }
                     for (item in messageEventListeners) {
@@ -1262,7 +1199,7 @@ class IMService(val config: IIMConfig) {
                     }
 
                     override fun onError(errorCode: RongIMClient.ErrorCode?) {
-                        LogUtil.d(TAG_IM_SERVICE, "recallMessage errorCode = ${errorCode?.value}")
+                        Log.d(TAG_IM_SERVICE, "recallMessage errorCode = ${errorCode?.value}")
                         callback?.onError(errorCode)
                     }
                 })
@@ -1553,7 +1490,7 @@ class IMService(val config: IIMConfig) {
         callback: RongIMClient.ResultCallback<Boolean>?
     ) {
         if (conversationIdentifier == null) {
-            LogUtil.e(TAG_IM_SERVICE, "saveTextMessageDraft conversationIdentifier is null")
+            Log.e(TAG_IM_SERVICE, "saveTextMessageDraft conversationIdentifier is null")
             callback?.onError(RongIMClient.ErrorCode.PARAMETER_ERROR)
             return
         }
@@ -1742,7 +1679,7 @@ class IMService(val config: IIMConfig) {
                 resultCallback
             ) == true
         ) {
-            LogUtil.d(TAG_IM_SERVICE, "message insertOut has been intercepted.")
+            Log.d(TAG_IM_SERVICE, "message insertOut has been intercepted.")
             return
         }
         ChannelClient.getInstance()
@@ -1933,10 +1870,6 @@ class IMService(val config: IIMConfig) {
         }
     }
 
-    fun refreshUserInfo(userInfo: IMUserInfo) {
-        IMUserInfoManager.refreshUserInfo(userInfo)
-    }
-
     /**
      * 根据消息 Message 设置消息状态,回调方式获取设置是否成功。
      *
@@ -1947,7 +1880,7 @@ class IMService(val config: IIMConfig) {
         message: Message, callback: RongIMClient.ResultCallback<Boolean>?
     ) {
         if (message.messageId <= 0 || message.sentStatus == null) {
-            LogUtil.e(TAG_IM_SERVICE, "setMessageSentStatus message is null or messageId <= 0")
+            Log.e(TAG_IM_SERVICE, "setMessageSentStatus message is null or messageId <= 0")
             callback?.onError(RongIMClient.ErrorCode.PARAMETER_ERROR)
             return
         }

+ 0 - 9
frame/imkit/src/main/java/com/adealink/frame/imkit/config/IIMConfig.kt

@@ -1,14 +1,5 @@
 package com.adealink.frame.imkit.config
 
-import com.adealink.frame.imkit.userinfo.UserDataProvider
-import com.adealink.frame.log.ILog
-
-
 interface IIMConfig {
     val appKey: String
-    val logger: ILog
-    val userInfoProvider: UserDataProvider.UserInfoProvider
-
-    fun getAppLanguageCode(): String
-    fun routeUrl(url: String)
 }

+ 0 - 11
frame/imkit/src/main/java/com/adealink/frame/imkit/config/IMConfigCenter.kt

@@ -1,11 +0,0 @@
-package com.adealink.frame.imkit.config
-
-import com.adealink.frame.imkit.conversation.extension.DefaultExtensionConfig
-import com.adealink.frame.imkit.conversation.extension.IExtensionConfig
-
-/** IM SDK 配置入口。 应用可以通过该类更改各页面的配置。 注意:需要在 init() 之前调用。 */
-object IMConfigCenter {
-    var conversationListConfig: ConversationListConfig = ConversationListConfig()
-    var conversationConfig: ConversationConfig = ConversationConfig()
-    var extensionConfig: IExtensionConfig = DefaultExtensionConfig()
-}

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/MessageInterceptor.java → frame/imkit/src/main/java/com/adealink/frame/imkit/config/MessageInterceptor.java

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit;
+package com.adealink.frame.imkit.config;
 
 import io.rong.imlib.RongIMClient;
 import io.rong.imlib.model.Conversation;

+ 0 - 16
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/DefaultExtensionConfig.kt

@@ -1,16 +0,0 @@
-package com.adealink.frame.imkit.conversation.extension
-
-import com.adealink.frame.imkit.conversation.extension.emotion.EmojiTab
-import com.adealink.frame.imkit.conversation.extension.emotion.IEmoticonTab
-import io.rong.imlib.model.Conversation
-
-class DefaultExtensionConfig: IExtensionConfig {
-
-    override fun getEmoticonTabs(): Map<String, MutableList<IEmoticonTab>> {
-        return hashMapOf(DEFAULT_TAG to mutableListOf(EmojiTab()))
-    }
-
-    companion object {
-        const val DEFAULT_TAG = "DefaultExtension"
-    }
-}

+ 0 - 7
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/IExtensionAttachInfoListener.kt

@@ -1,7 +0,0 @@
-package com.adealink.frame.imkit.conversation.extension
-
-import android.view.View
-
-interface IExtensionAttachInfoListener {
-    fun setAttachedInfo(view: View)
-}

+ 0 - 12
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/IExtensionConfig.kt

@@ -1,12 +0,0 @@
-package com.adealink.frame.imkit.conversation.extension
-
-import com.adealink.frame.imkit.conversation.extension.emotion.IEmoticonTab
-
-interface IExtensionConfig {
-    /**
-     * 返回输入框表情区域配置的表情 tab 列表。
-     *
-     * @return 表情 tab 列表。
-     */
-    fun getEmoticonTabs(): Map<String, MutableList<IEmoticonTab>>
-}

+ 0 - 83
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/messagelist/status/IMessageState.kt

@@ -1,83 +0,0 @@
-package com.adealink.frame.imkit.conversation.messagelist.status
-
-import android.os.Bundle
-import com.adealink.frame.imkit.conversation.viewmodel.ConversationViewModel
-import com.adealink.frame.imkit.model.UiMessage
-
-/** 处理,消息列表,历史消息展示条,新消息展示条相关逻辑  */
-interface IMessageState {
-    /**
-     * 处理历史消息
-     *
-     * @param viewModel [ConversationViewModel]
-     * @param bundle Bundle
-     */
-    fun init(viewModel: ConversationViewModel, bundle: Bundle?)
-
-    /**
-     * 处理上拉加载更多
-     *
-     * @param viewModel [ConversationViewModel]
-     */
-    fun onLoadMore(viewModel: ConversationViewModel)
-
-    /**
-     * 处理下拉刷新
-     *
-     * @param viewModel [ConversationViewModel]
-     */
-    fun onRefresh(viewModel: ConversationViewModel)
-
-    /**
-     * 收到消息回调
-     *
-     * @param viewModel [ConversationViewModel]
-     * @param message 消息
-     * @param left 剩余未拉取消息数目
-     * @param hasPackage 标识是否还有剩余的消息包
-     * @param offline 是否离线
-     */
-    fun onReceived(
-        viewModel: ConversationViewModel,
-        message: UiMessage,
-        left: Int,
-        hasPackage: Boolean,
-        offline: Boolean
-    )
-
-    /**
-     * 新消息按钮点击
-     *
-     * @param viewModel [ConversationViewModel]
-     */
-    fun onNewMessageBarClick(viewModel: ConversationViewModel)
-
-    /**
-     * 滑动到底部
-     *
-     * @param viewModel [ConversationViewModel]
-     */
-    fun onScrollToBottom(viewModel: ConversationViewModel)
-
-    /**
-     * 历史消息 bar 点击事件
-     *
-     * @param viewModel [ConversationViewModel]
-     */
-    fun onHistoryBarClick(viewModel: ConversationViewModel)
-
-    /**
-     * 清除消息
-     *
-     * @param viewModel [ConversationViewModel]
-     */
-    fun onClearMessage(viewModel: ConversationViewModel)
-
-    /**
-     * 是否是正常会话状态
-     *
-     * @param viewModel [ConversationViewModel]
-     * @return 是否是正常会话状态
-     */
-    fun isNormalState(viewModel: ConversationViewModel): Boolean
-}

+ 0 - 11
frame/imkit/src/main/java/com/adealink/frame/imkit/conversationlist/provider/PrivateConversationProvider.kt

@@ -1,11 +0,0 @@
-package com.adealink.frame.imkit.conversationlist.provider
-
-import com.adealink.frame.imkit.conversationlist.model.BaseUiConversation
-import io.rong.imlib.model.Conversation
-
-open class PrivateConversationProvider : BaseConversationProvider() {
-
-    override fun isItemViewType(item: BaseUiConversation): Boolean {
-        return Conversation.ConversationType.PRIVATE == item.conversation.conversationType
-    }
-}

+ 0 - 3
frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/PageDestroyEvent.kt

@@ -1,3 +0,0 @@
-package com.adealink.frame.imkit.event.uievent
-
-class PageDestroyEvent : PageEvent

+ 0 - 3
frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/ScrollEvent.kt

@@ -1,3 +0,0 @@
-package com.adealink.frame.imkit.event.uievent
-
-class ScrollEvent(val position: Int) : PageEvent

+ 0 - 3
frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/ScrollToEndEvent.kt

@@ -1,3 +0,0 @@
-package com.adealink.frame.imkit.event.uievent
-
-class ScrollToEndEvent : PageEvent

+ 0 - 5
frame/imkit/src/main/java/com/adealink/frame/imkit/event/uievent/ShowLongClickDialogEvent.kt

@@ -1,5 +0,0 @@
-package com.adealink.frame.imkit.event.uievent
-
-import com.adealink.frame.imkit.conversation.viewmodel.MessageItemLongClickBean
-
-class ShowLongClickDialogEvent(val bean: MessageItemLongClickBean) : PageEvent

+ 3 - 2
frame/imkit/src/main/java/com/adealink/frame/imkit/BaseConversationEventListener.kt → frame/imkit/src/main/java/com/adealink/frame/imkit/listener/BaseConversationEventListener.kt

@@ -1,9 +1,10 @@
-package com.adealink.frame.imkit
+package com.adealink.frame.imkit.listener
 
 import io.rong.imlib.RongIMClient
 import io.rong.imlib.model.Conversation
 
-abstract class BaseConversationEventListener : ConversationEventListener {
+abstract class BaseConversationEventListener :
+    ConversationEventListener {
     override fun onSaveDraft(
         type: Conversation.ConversationType,
         targetId: String,

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/ConversationEventListener.java → frame/imkit/src/main/java/com/adealink/frame/imkit/listener/ConversationEventListener.java

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit;
+package com.adealink.frame.imkit.listener;
 
 import io.rong.imlib.IRongCoreEnum;
 import io.rong.imlib.RongIMClient;

+ 13 - 15
frame/imkit/src/main/java/com/adealink/frame/imkit/manager/AudioPlayManager.java

@@ -18,13 +18,11 @@ import android.os.Looper;
 import android.os.PowerManager;
 import android.view.WindowManager;
 
-import com.adealink.frame.imkit.utils.LogUtil;
+import com.adealink.frame.log.Log;
 
 import java.io.FileInputStream;
 import java.io.IOException;
 
-import io.rong.common.rlog.RLog;
-
 public class AudioPlayManager implements SensorEventListener {
     private static final String TAG = "AudioPlayManager";
 
@@ -59,7 +57,7 @@ public class AudioPlayManager implements SensorEventListener {
         synchronized (mLock) {
             try {
                 float range = event.values[0];
-                RLog.d(
+                Log.d(
                         TAG,
                         "onSensorChanged. range:"
                                 + range
@@ -114,13 +112,13 @@ public class AudioPlayManager implements SensorEventListener {
                                     });
                             mMediaPlayer.prepareAsync();
                         } catch (IOException e) {
-                            RLog.e(TAG, "onSensorChanged", e);
+                            Log.e(TAG, "onSensorChanged", e);
                         } finally {
                             if (fis != null) {
                                 try {
                                     fis.close();
                                 } catch (IOException e) {
-                                    RLog.e(TAG, "startPlay", e);
+                                    Log.e(TAG, "startPlay", e);
                                 }
                             }
                         }
@@ -150,7 +148,7 @@ public class AudioPlayManager implements SensorEventListener {
                     }
                 }
             } catch (Exception e) {
-                RLog.e(TAG, "onSensorChanged", e);
+                Log.e(TAG, "onSensorChanged", e);
             }
         }
     }
@@ -231,7 +229,7 @@ public class AudioPlayManager implements SensorEventListener {
                                 try {
                                     Thread.sleep(1000);
                                 } catch (InterruptedException e) {
-                                    RLog.e(TAG, "replay", e);
+                                    Log.e(TAG, "replay", e);
                                     // Restore interrupted state...
                                     Thread.currentThread().interrupt();
                                 }
@@ -254,13 +252,13 @@ public class AudioPlayManager implements SensorEventListener {
                 mMediaPlayer.prepareAsync();
                 mMediaPlayer.setVolume(1.0f, 1.0f);
             } catch (IOException e) {
-                RLog.e(TAG, "replay", e);
+                Log.e(TAG, "replay", e);
             } finally {
                 if (fis != null) {
                     try {
                         fis.close();
                     } catch (IOException e) {
-                        RLog.e(TAG, "replay", e);
+                        Log.e(TAG, "replay", e);
                     }
                 }
             }
@@ -270,7 +268,7 @@ public class AudioPlayManager implements SensorEventListener {
     public void startPlay(final Context context, Uri audioUri, IAudioPlayListener playListener) {
         synchronized (mLock) {
             if (context == null || audioUri == null) {
-                RLog.e(TAG, "startPlay context or audioUri is null.");
+                Log.e(TAG, "startPlay context or audioUri is null.");
                 return;
             }
             mContext = context;
@@ -284,7 +282,7 @@ public class AudioPlayManager implements SensorEventListener {
                     new AudioManager.OnAudioFocusChangeListener() {
                         public void onAudioFocusChange(int focusChange) {
                             synchronized (mLock) {
-                                RLog.d(TAG, "OnAudioFocusChangeListener " + focusChange);
+                                Log.d(TAG, "OnAudioFocusChangeListener " + focusChange);
                                 if (mAudioManager != null
                                         && focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                                     mAudioManager.abandonAudioFocus(afChangeListener);
@@ -392,7 +390,7 @@ public class AudioPlayManager implements SensorEventListener {
                             }
                         });
             } catch (Exception e) {
-                RLog.e(TAG, "startPlay", e);
+                Log.e(TAG, "startPlay", e);
                 if (_playListener != null) {
                     _playListener.onStop(audioUri);
                     _playListener = null;
@@ -403,7 +401,7 @@ public class AudioPlayManager implements SensorEventListener {
                     try {
                         fis.close();
                     } catch (IOException e) {
-                        RLog.e(TAG, "startPlay", e);
+                        Log.e(TAG, "startPlay", e);
                     }
                 }
             }
@@ -485,7 +483,7 @@ public class AudioPlayManager implements SensorEventListener {
                     mMediaPlayer.release();
                     mMediaPlayer = null;
                 } catch (IllegalStateException e) {
-                    RLog.e(TAG, "resetMediaPlayer", e);
+                    Log.e(TAG, "resetMediaPlayer", e);
                 }
             }
         }

+ 12 - 13
frame/imkit/src/main/java/com/adealink/frame/imkit/manager/UnReadMessageManager.kt

@@ -1,14 +1,13 @@
 package com.adealink.frame.imkit.manager
 
-import com.adealink.frame.imkit.BaseConversationEventListener
-import com.adealink.frame.imkit.ConversationEventListener
+import com.adealink.frame.imkit.listener.BaseConversationEventListener
+import com.adealink.frame.imkit.listener.ConversationEventListener
 import com.adealink.frame.imkit.IMService
-import com.adealink.frame.imkit.config.IMConfigCenter
 import com.adealink.frame.imkit.event.actionevent.BaseMessageEvent
 import com.adealink.frame.imkit.event.actionevent.InsertEvent
 import com.adealink.frame.imkit.event.actionevent.MessageEventListener
 import com.adealink.frame.imkit.model.TAG_IM_UNREAD
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
 import io.rong.imlib.RongIMClient
 import io.rong.imlib.model.Conversation.ConversationType
 import io.rong.imlib.model.Message
@@ -113,7 +112,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
                         msgInfo.targetId,
                         object : RongIMClient.ResultCallback<Int>() {
                             override fun onSuccess(integer: Int) {
-                                LogUtil.d(TAG_IM_UNREAD, "get targetId:${msgInfo.targetId}, result: $integer")
+                                Log.d(TAG_IM_UNREAD, "get targetId:${msgInfo.targetId}, result: $integer")
                                 msgInfo.count = integer
                                 msgInfo.observer?.onCountChanged(integer)
                             }
@@ -132,7 +131,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
                         msgInfo.conversationTypes,
                         object : RongIMClient.ResultCallback<Int>() {
                             override fun onSuccess(integer: Int) {
-                                LogUtil.d(TAG_IM_UNREAD, "get result: $integer")
+                                Log.d(TAG_IM_UNREAD, "get result: $integer")
                                 msgInfo.count = integer
                                 msgInfo.observer?.onCountChanged(integer)
                             }
@@ -155,7 +154,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
                         msgInfo.targetId,
                         object : RongIMClient.ResultCallback<Int>() {
                             override fun onSuccess(integer: Int) {
-                                LogUtil.d(TAG_IM_UNREAD, "get targetId:${msgInfo.targetId}, result: $integer")
+                                Log.d(TAG_IM_UNREAD, "get targetId:${msgInfo.targetId}, result: $integer")
                                 msgInfo.count = integer
                                 msgInfo.observer?.onCountChanged(integer)
                             }
@@ -171,7 +170,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
                         msgInfo.conversationTypes,
                         object : RongIMClient.ResultCallback<Int>() {
                             override fun onSuccess(integer: Int) {
-                                LogUtil.d(TAG_IM_UNREAD, "get result: $integer")
+                                Log.d(TAG_IM_UNREAD, "get result: $integer")
                                 msgInfo.count = integer
                                 msgInfo.observer?.onCountChanged(integer)
                             }
@@ -196,7 +195,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
         observer: IUnReadMessageObserver?,
     ) {
         if (observer == null) {
-            LogUtil.e(TAG_IM_UNREAD, "can't add a null observer!")
+            Log.e(TAG_IM_UNREAD, "can't add a null observer!")
             return
         }
         synchronized(foreverMultiConversationUnreadInfos) {
@@ -209,7 +208,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
                     conversationTypes,
                     object : RongIMClient.ResultCallback<Int>() {
                         override fun onSuccess(integer: Int) {
-                            LogUtil.d(TAG_IM_UNREAD, "get result: $integer")
+                            Log.d(TAG_IM_UNREAD, "get result: $integer")
                             msgInfo.count = integer
                             msgInfo.observer?.onCountChanged(integer)
                         }
@@ -234,7 +233,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
         observer: IUnReadMessageObserver?,
     ) {
         if (observer == null) {
-            LogUtil.e(TAG_IM_UNREAD, "can't add a null observer!")
+            Log.e(TAG_IM_UNREAD, "can't add a null observer!")
             return
         }
 
@@ -250,7 +249,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
                     targetId,
                     object : RongIMClient.ResultCallback<Int>() {
                         override fun onSuccess(integer: Int) {
-                            LogUtil.d(TAG_IM_UNREAD, "get targetId:${msgInfo.targetId}, result: $integer")
+                            Log.d(TAG_IM_UNREAD, "get targetId:${msgInfo.targetId}, result: $integer")
                             msgInfo.count = integer
                             msgInfo.observer?.onCountChanged(integer)
                         }
@@ -264,7 +263,7 @@ object UnReadMessageManager : RongIMClient.OnReceiveMessageWrapperListener(),
 
     fun removeForeverObserver(observer: IUnReadMessageObserver?) {
         if (observer == null) {
-            LogUtil.d(TAG_IM_UNREAD, "removeOnReceiveUnreadCountChangedListener Illegal argument")
+            Log.d(TAG_IM_UNREAD, "removeOnReceiveUnreadCountChangedListener Illegal argument")
             return
         }
         synchronized(foreverMultiConversationUnreadInfos) {

+ 0 - 21
frame/imkit/src/main/java/com/adealink/frame/imkit/model/MessageBlockRes.kt

@@ -1,21 +0,0 @@
-package com.adealink.frame.imkit.model
-
-import com.google.gson.annotations.GsonNullable
-import com.google.gson.annotations.JsonAdapter
-import com.google.gson.annotations.SerializedName
-import com.google.gson.internal.bind.ExtReflectiveTypeAdapterFactory
-
-data class MessageBlockRlt(
-    @GsonNullable
-    @SerializedName("result")
-    val result: MessageBlockRes?,
-)
-
-data class MessageBlockRes(
-    @SerializedName("code")
-    val code: Int? = 0,
-    @SerializedName("message")
-    val message: String? = "",
-    @SerializedName("sucessed")
-    val success: Boolean? = false
-)

+ 0 - 5
frame/imkit/src/main/java/com/adealink/frame/imkit/model/Tags.kt

@@ -3,13 +3,8 @@ package com.adealink.frame.imkit.model
 const val TAG_IM = "tag_im"
 const val TAG_IM_UI = "${TAG_IM}_ui"
 const val TAG_IM_SERVICE = "${TAG_IM}_service"
-const val TAG_IM_MSG_PROVIDER = "${TAG_IM}_msg_provider"
-const val TAG_IM_CONV_LIST_VM = "${TAG_IM}_conv_list_vm"
-const val TAG_IM_CONV_VM = "${TAG_IM}_conv_vm"
 const val TAG_IM_KEYBOARD = "${TAG_IM}_keyboard"
-const val TAG_IM_PROCESSOR = "${TAG_IM}_processor"
 const val TAG_IM_RESEND = "${TAG_IM}_resend"
 const val TAG_IM_UNREAD = "${TAG_IM}_unread"
-const val TAG_IM_REFERENCE = "${TAG_IM}_reference"
 const val TAG_IM_MSG_BLOCK = "${TAG_IM}_msg_block"
 const val TAG_IM_MSG_EXPANSION = "${TAG_IM}_msg_expansion"

+ 9 - 9
frame/imkit/src/main/java/com/adealink/frame/imkit/resend/ResendManager.kt

@@ -5,7 +5,7 @@ import android.os.HandlerThread
 import android.text.TextUtils
 import com.adealink.frame.imkit.IMService
 import com.adealink.frame.imkit.model.TAG_IM_RESEND
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
 import io.rong.imlib.IRongCallback
 import io.rong.imlib.IRongCoreEnum
 import io.rong.imlib.RongIMClient
@@ -57,7 +57,7 @@ object ResendManager {
                 }
                 if (isResendErrorCode(errorCode)) {
                     if (!messageMap.containsKey(message.messageId)) {
-                        LogUtil.d(TAG_IM_RESEND, "addResendMessage : id=" + message.messageId)
+                        Log.d(TAG_IM_RESEND, "addResendMessage : id=" + message.messageId)
                         messageMap[message.messageId] = message
                         messageQueue.add(message.messageId)
                         beginResend()
@@ -103,12 +103,12 @@ object ResendManager {
         resendHandler.post(
             Runnable {
                 if (messageMap.size == 0) {
-                    LogUtil.i(TAG_IM_RESEND, "beginResend onChanged no message need resend")
+                    Log.i(TAG_IM_RESEND, "beginResend onChanged no message need resend")
                     isProcessing = false
                     return@Runnable
                 }
                 if (isProcessing) {
-                    LogUtil.i(TAG_IM_RESEND, "beginResend ConnectionStatus is resending")
+                    Log.i(TAG_IM_RESEND, "beginResend ConnectionStatus is resending")
                     return@Runnable
                 }
                 isProcessing = true
@@ -120,7 +120,7 @@ object ResendManager {
         resendHandler.postDelayed(
             Runnable {
                 val idInteger = messageQueue.peek()
-                LogUtil.d(TAG_IM_RESEND, "beginResend: messageId = $idInteger")
+                Log.d(TAG_IM_RESEND, "beginResend: messageId = $idInteger")
                 if (idInteger == null
                     || IMService.innerService.getCurrentConnectionStatus()
                     != RongIMClient.ConnectionStatusListener.ConnectionStatus
@@ -142,7 +142,7 @@ object ResendManager {
                         }
 
                         override fun onSuccess(message: Message) {
-                            LogUtil.i(
+                            Log.i(
                                 TAG_IM_RESEND,
                                 "resendMessage success messageId = "
                                         + message.messageId
@@ -154,7 +154,7 @@ object ResendManager {
                         override fun onError(
                             message: Message, coreErrorCode: RongIMClient.ErrorCode
                         ) {
-                            LogUtil.i(
+                            Log.i(
                                 TAG_IM_RESEND,
                                 "resendMessage success messageId = "
                                         + message.messageId
@@ -188,11 +188,11 @@ object ResendManager {
      */
     private fun resendMessage(message: Message?, callback: ReSendMessageCallback) {
         if (message == null) {
-            LogUtil.i(TAG_IM_RESEND, "resendMessage: Message is Null")
+            Log.i(TAG_IM_RESEND, "resendMessage: Message is Null")
             return
         }
         if (TextUtils.isEmpty(message.targetId) || message.content == null) {
-            LogUtil.e(TAG_IM_RESEND, "targetId or messageContent is Null")
+            Log.e(TAG_IM_RESEND, "targetId or messageContent is Null")
             removeResendMessage(message.messageId)
             return
         }

+ 0 - 14
frame/imkit/src/main/java/com/adealink/frame/imkit/userinfo/model/IMUserInfo.kt

@@ -1,14 +0,0 @@
-package com.adealink.frame.imkit.userinfo.model
-
-/**
- * IM用户信息实体类
- */
-open class IMUserInfo @JvmOverloads constructor(
-    var id: String,
-    var name: String?,
-    var avatarUrl: String?,
-    var flag: String? = null,
-    var alias: String? = null,
-    var extra: String? = null,
-    var userInfo: Any? = null,
-)

+ 0 - 234
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/IMDateUtils.java

@@ -1,234 +0,0 @@
-package com.adealink.frame.imkit.utils;
-
-import android.content.Context;
-import android.text.TextUtils;
-
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import com.adealink.frame.imkit.R;
-
-
-public class IMDateUtils {
-
-    private static final String TAG = IMDateUtils.class.getCanonicalName();
-    private static final String SPACE_CHAR = " ";
-    private static final int OTHER = 2014;
-    private static final int TODAY = 6;
-    private static final int YESTERDAY = 15;
-
-    public static int judgeDate(Context context, Date date) {
-        // 今天
-        Calendar calendarToday = Calendar.getInstance();
-        calendarToday.set(Calendar.HOUR_OF_DAY, 0);
-        calendarToday.set(Calendar.MINUTE, 0);
-        calendarToday.set(Calendar.SECOND, 0);
-        calendarToday.set(Calendar.MILLISECOND, 0);
-        // 昨天
-        Calendar calendarYesterday = Calendar.getInstance();
-        calendarYesterday.add(Calendar.DATE, -1);
-        calendarYesterday.set(Calendar.HOUR_OF_DAY, 0);
-        calendarYesterday.set(Calendar.MINUTE, 0);
-        calendarYesterday.set(Calendar.SECOND, 0);
-        calendarYesterday.set(Calendar.MILLISECOND, 0);
-
-        Calendar calendarTomorrow = Calendar.getInstance();
-        calendarTomorrow.add(Calendar.DATE, 1);
-        calendarTomorrow.set(Calendar.HOUR_OF_DAY, 0);
-        calendarTomorrow.set(Calendar.MINUTE, 0);
-        calendarTomorrow.set(Calendar.SECOND, 0);
-        calendarTomorrow.set(Calendar.MILLISECOND, 0);
-
-        // 目标日期
-        Calendar calendarTarget = Calendar.getInstance();
-        calendarTarget.setTime(date);
-
-        if (calendarTarget.before(calendarYesterday)) { // 是否在calendarT之前
-            return OTHER;
-        } else if (calendarTarget.before(calendarToday)) {
-            return YESTERDAY;
-        } else if (calendarTarget.before(calendarTomorrow)) {
-            return TODAY;
-        } else {
-            return OTHER;
-        }
-    }
-
-    private static String getWeekDay(Context context, int dayInWeek) {
-        String weekDay = "";
-        switch (dayInWeek) {
-            case 1:
-                weekDay = context.getResources().getString(R.string.rc_date_sunday);
-                break;
-            case 2:
-                weekDay = context.getResources().getString(R.string.rc_date_monday);
-                break;
-            case 3:
-                weekDay = context.getResources().getString(R.string.rc_date_tuesday);
-                break;
-            case 4:
-                weekDay = context.getResources().getString(R.string.rc_date_wednesday);
-                break;
-            case 5:
-                weekDay = context.getResources().getString(R.string.rc_date_thursday);
-                break;
-            case 6:
-                weekDay = context.getResources().getString(R.string.rc_date_friday);
-                break;
-            case 7:
-                weekDay = context.getResources().getString(R.string.rc_date_saturday);
-                break;
-            default:
-                break;
-        }
-        return weekDay;
-    }
-
-    public static boolean isTime24Hour(Context context) {
-        String timeFormat =
-                android.provider.Settings.System.getString(
-                        context.getContentResolver(), android.provider.Settings.System.TIME_12_24);
-
-        return timeFormat != null && timeFormat.equals("24");
-    }
-
-    private static String getTimeString(long dateMillis, Context context) {
-        if (dateMillis <= 0) {
-            return "";
-        }
-
-        Date date = new Date(dateMillis);
-        String formatTime;
-        if (isTime24Hour(context)) {
-            formatTime = formatDate(context, date, "HH:mm");
-        } else {
-            formatTime = formatDate(context, date, "h:mm");
-            formatTime = formatTime + SPACE_CHAR + getTime12HourDes(dateMillis, context);
-        }
-        return formatTime;
-    }
-
-    private static String getTime12HourDes(long dateMillis, Context context) {
-        Calendar calendarTime =
-                Calendar.getInstance();
-        calendarTime.setTimeInMillis(dateMillis);
-        int hour = calendarTime.get(Calendar.HOUR);
-        String des = "";
-        if (calendarTime.get(Calendar.AM_PM) == Calendar.AM) { // AM
-            if (hour < 6) { // 凌晨
-                des = context.getResources().getString(R.string.rc_date_morning);
-            } else { // 上午
-                des = context.getResources().getString(R.string.rc_date_am);
-            }
-        } else { // PM
-            if (hour == 0) { // 中午
-                des = context.getResources().getString(R.string.rc_date_noon);
-            } else if (hour <= 5) { // 下午
-                des = context.getResources().getString(R.string.rc_date_pm);
-            } else { // 晚上
-                des = context.getResources().getString(R.string.rc_date_night);
-            }
-        }
-        return des;
-    }
-
-    private static String getDateTimeString(long dateMillis, boolean showTime, Context context) {
-        if (dateMillis <= 0) {
-            return "";
-        }
-
-        String formatDate = null;
-
-        Date date = new Date(dateMillis);
-        int type = judgeDate(context, date);
-        long time = System.currentTimeMillis();
-        Calendar calendarCur = Calendar.getInstance();
-        Calendar calendardate = Calendar.getInstance();
-        calendardate.setTimeInMillis(dateMillis);
-        calendarCur.setTimeInMillis(time);
-        int month = calendardate.get(Calendar.MONTH);
-        int year = calendardate.get(Calendar.YEAR);
-        int weekInMonth = calendardate.get(Calendar.WEEK_OF_MONTH);
-        int monthCur = calendarCur.get(Calendar.MONTH);
-        int yearCur = calendarCur.get(Calendar.YEAR);
-        int weekInMonthCur = calendarCur.get(Calendar.WEEK_OF_MONTH);
-
-        switch (type) {
-            case TODAY:
-                formatDate = getTimeString(dateMillis, context);
-                break;
-
-            case YESTERDAY:
-                String formatString = context.getResources().getString(R.string.rc_date_yesterday);
-                if (showTime) {
-                    formatDate = formatString + " " + getTimeString(dateMillis, context);
-                } else {
-                    formatDate = formatString;
-                }
-                break;
-
-            case OTHER:
-                if (year == yearCur) { // 同年
-                    if (month == monthCur && weekInMonth == weekInMonthCur) { // 同月同周
-                        formatDate = getWeekDay(context, calendardate.get(Calendar.DAY_OF_WEEK));
-                    } else { // 不同月
-                        formatDate = formatDate(context, date, "M/d");
-                    }
-                } else {
-                    formatDate = formatDate(context, date, "yyyy/M/d");
-                }
-
-                if (showTime) {
-                    formatDate = formatDate + " " + getTimeString(dateMillis, context);
-                }
-                break;
-            default:
-                break;
-        }
-
-        return formatDate;
-    }
-
-    public static String getConversationListFormatDate(long dateMillis, Context context) {
-        return getDateTimeString(dateMillis, false, context);
-    }
-
-    public static String getConversationFormatDate(long dateMillis, Context context) {
-        return getDateTimeString(dateMillis, true, context);
-    }
-
-    /**
-     * @param currentTime 当前时间
-     * @param preTime 之前的某个时间
-     * @param interval 时间间隔
-     * @return true 间隔大于interval秒 false 小于等于
-     */
-    public static boolean isShowChatTime(
-            Context context, long currentTime, long preTime, int interval) {
-
-        int typeCurrent = judgeDate(context, new Date(currentTime));
-        int typePre = judgeDate(context, new Date(preTime));
-
-        if (typeCurrent == typePre) {
-            return (currentTime - preTime) > interval * 1000;
-        } else {
-            return true;
-        }
-    }
-
-    public static String formatDate(Context context, Date date, String fromat) {
-        if (TextUtils.isEmpty(fromat)) {
-            return "";
-        }
-
-        try {
-            SimpleDateFormat sdf =
-                    new SimpleDateFormat(fromat);
-            return sdf.format(date);
-        } catch (IllegalArgumentException e1) {
-
-        }
-
-        return "";
-    }
-}

+ 0 - 5
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/IMRouteUtils.java

@@ -1,5 +0,0 @@
-package com.adealink.frame.imkit.utils;
-
-public class IMRouteUtils {
-    public static final String EXTRA_LOCALE_SENT_TIME = "extra_locale_sent_time";
-}

+ 0 - 29
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/IMViewUtils.java

@@ -1,29 +0,0 @@
-package com.adealink.frame.imkit.utils;
-
-import android.view.View;
-import android.view.ViewGroup;
-
-import io.rong.common.rlog.RLog;
-
-public class IMViewUtils {
-
-    /** 安全的addView */
-    public static void addView(ViewGroup viewGroup, View addedView) {
-        addView(viewGroup, addedView, -1);
-    }
-
-    /** 安全的addView */
-    public static void addView(ViewGroup viewGroup, View addedView, int index) {
-        if (addedView == null || viewGroup == null) {
-            return;
-        }
-        try {
-            if (addedView.getParent() != null) {
-                ((ViewGroup) addedView.getParent()).removeView(addedView);
-            }
-            viewGroup.addView(addedView, index);
-        } catch (Exception e) {
-            RLog.d("RongViewUtils", "addView e:" + e);
-        }
-    }
-}

+ 0 - 17
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/LogUtil.kt

@@ -1,17 +0,0 @@
-package com.adealink.frame.imkit.utils
-
-import com.adealink.frame.imkit.IMService
-
-object LogUtil {
-    fun d(tag: String, msg: String) {
-        IMService.innerService.config.logger.logD(tag, msg)
-    }
-
-    fun i(tag: String, msg: String) {
-        IMService.innerService.config.logger.logI(tag, msg)
-    }
-
-    fun e(tag: String, msg: String) {
-        IMService.innerService.config.logger.logE(tag, msg)
-    }
-}

+ 0 - 59
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/RTLUtils.java

@@ -1,59 +0,0 @@
-package com.adealink.frame.imkit.utils;
-
-import android.text.TextUtils;
-import android.view.View;
-
-import java.util.Locale;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/** 在某些语言下,处理RTL模式工具类 */
-public class RTLUtils {
-
-    private static final String AIT = "@";
-    private static final Pattern pLetter = Pattern.compile("[a-zA-Z0-9]");
-    private static final Pattern pChinese = Pattern.compile("[\u4e00-\u9fa5]");
-
-    public static String adapterAitInRTL(String str) {
-        return getRTLCode(str, AIT) + str;
-    }
-
-    public static String getRTLCode(String str, String first) {
-        if (TextUtils.getLayoutDirectionFromLocale(Locale.getDefault())
-                != View.LAYOUT_DIRECTION_RTL) {
-            return "";
-        }
-        if (TextUtils.isEmpty(str)) {
-            return "";
-        }
-        // @字符前需添加"\u200e"(LRM)或"\u200f"(RLM)表明方向,否则RLT下多种文字混排有问题
-        if (str.length() < 2) {
-            return "";
-        }
-        String[] splitStr = str.split("");
-        if (splitStr.length < 2) {
-            return "";
-        }
-        // 判断首个字符,空则跳过
-        if (!TextUtils.isEmpty(first) && !splitStr[0].equals(first)) {
-            return "";
-        }
-        // 判断第二个字符
-        if (isChineseOrLetter(splitStr[1])) {
-            return "\u200e";
-        } else {
-            return "\u200f";
-        }
-    }
-
-    public static boolean isChineseOrLetter(String txt) {
-        // 英文字符和数字
-        Matcher mLetter = pLetter.matcher(txt);
-        if (mLetter.matches()) {
-            return true;
-        }
-        // 中文字符
-        Matcher mChinese = pChinese.matcher(txt);
-        return mChinese.matches();
-    }
-}

+ 0 - 129
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/TextViewUtils.java

@@ -1,129 +0,0 @@
-package com.adealink.frame.imkit.utils;
-
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-import android.text.TextPaint;
-import android.text.style.ForegroundColorSpan;
-import android.text.style.URLSpan;
-import android.text.util.Linkify;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-
-/** 处理 textMessage 和 ReferenceMessage 的文本内容 */
-public class TextViewUtils {
-
-    /** 字符串校验限制,大于等于 150 字符开线程校验,否则在当前线程校验 */
-    private static final int CONTENT_LIMIT_LENGTH = 150;
-
-    /**
-     * @param content 替换内容
-     * @param callBack 异步请求回调
-     * @return 内容的 spannable
-     */
-    public static SpannableStringBuilder getSpannable(
-            String content, final RegularCallBack callBack) {
-        return getSpannable(content, true, callBack);
-    }
-
-    /**
-     * @param content 替换内容
-     * @param callBack 异步请求回调
-     * @return 内容的 spannable
-     */
-    public static SpannableStringBuilder getSpannable(
-            String content, boolean regular, final RegularCallBack callBack) {
-        if (content == null) {
-            return new SpannableStringBuilder("");
-        }
-        // 处理RTL
-        String adapterContent = RTLUtils.adapterAitInRTL(content);
-        SpannableStringBuilder emojiSpannable = new SpannableStringBuilder(adapterContent);
-        if (!regular) {
-            return emojiSpannable;
-        }
-        if (emojiSpannable.length() < CONTENT_LIMIT_LENGTH) {
-            regularContent(emojiSpannable);
-        } else {
-            final SpannableStringBuilder spannableStringBuilder =
-                    new SpannableStringBuilder(emojiSpannable);
-            ExecutorHelper.getInstance()
-                    .compressExecutor()
-                    .execute(
-                            new Runnable() {
-                                @Override
-                                public void run() {
-                                    regularContent(spannableStringBuilder);
-                                    callBack.finish(spannableStringBuilder);
-                                }
-                            });
-        }
-        return emojiSpannable;
-    }
-
-    /**
-     * @param content 替换内容
-     * @param callBack 异步请求回调
-     * @return 内容的 spannable
-     */
-    public static SpannableStringBuilder getRichSpannable(
-            String content, final RegularCallBack callBack, @ColorInt int foregroundColor) {
-        if (content == null) {
-            return new SpannableStringBuilder("");
-        }
-        SpannableStringBuilder emojiSpannable = new SpannableStringBuilder(content);
-        emojiSpannable.setSpan(
-                new ForegroundColorSpan(foregroundColor),
-                0,
-                content.length(),
-                Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-        if (emojiSpannable.length() < CONTENT_LIMIT_LENGTH) {
-            regularContent(emojiSpannable);
-        } else {
-            ExecutorHelper.getInstance()
-                    .compressExecutor()
-                    .execute(
-                            new Runnable() {
-                                @Override
-                                public void run() {
-                                    regularContent(emojiSpannable);
-                                    callBack.finish(emojiSpannable);
-                                }
-                            });
-        }
-        return emojiSpannable;
-    }
-
-    private static void regularContent(SpannableStringBuilder spannable) {
-        Linkify.addLinks(
-                spannable, Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES | Linkify.PHONE_NUMBERS);
-        URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class);
-        for (URLSpan span : spans) {
-            int start = spannable.getSpanStart(span);
-            int end = spannable.getSpanEnd(span);
-            spannable.removeSpan(span);
-            span = new URLSpanNoUnderline(span.getURL());
-            if (end < start) {
-                continue;
-            }
-            spannable.setSpan(span, start, end, 0);
-        }
-    }
-
-    public interface RegularCallBack {
-        void finish(SpannableStringBuilder spannable);
-    }
-
-    /** 取消超链接下划线的UrlSpan */
-    public static class URLSpanNoUnderline extends URLSpan {
-        public URLSpanNoUnderline(String url) {
-            super(url);
-        }
-
-        @Override
-        public void updateDrawState(@NonNull TextPaint ds) {
-            super.updateDrawState(ds);
-            ds.setUnderlineText(false);
-        }
-    }
-}

+ 0 - 112
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/ToastUtils.java

@@ -1,112 +0,0 @@
-package com.adealink.frame.imkit.utils;
-
-import android.content.Context;
-import android.os.Build;
-import android.widget.Toast;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import io.rong.imlib.common.ExecutorFactory;
-
-/**
- * toast 工具类,SDK 内部 toast 通过该类弹出。
- *
- * <p>App 可以通过 {@link #setInterceptor(ToastInterceptor)} 设置拦截器来拦截 SDK toast
- *
- * @author rongcloud
- */
-public final class ToastUtils {
-    private static ToastInterceptor interceptor;
-    private static Toast lastToast;
-
-    /**
-     * 弹出 toast,受 {@link #setInterceptor(ToastInterceptor)} 影响
-     *
-     * @param context context
-     * @param text toast 文本
-     * @param duration toast 显示时间, {@link Toast#LENGTH_SHORT} or {@link Toast#LENGTH_LONG}
-     * @discussion 在非 UI 线程会切换到 UI 线程弹 toast
-     */
-    public static void show(@Nullable Context context, @Nullable CharSequence text, int duration) {
-        if (context == null || text == null) {
-            return;
-        }
-
-        runOnUiThread(
-                new Runnable() {
-                    @Override
-                    public void run() {
-                        showOnMainThread(context, text, duration);
-                    }
-                });
-    }
-
-    /**
-     * 在 UI 线程运行。UI 线程直接运行,非 UI 线程切换到 UI 线程运行
-     *
-     * @param runnable runnable
-     */
-    private static void runOnUiThread(@Nullable Runnable runnable) {
-        if (runnable == null) {
-            return;
-        }
-        if (ExecutorFactory.isMainThread()) {
-            runnable.run();
-            return;
-        }
-        ExecutorFactory.getInstance().getMainHandler().post(runnable);
-    }
-
-    /**
-     * 在UI 线程弹 toast
-     *
-     * @param context context
-     * @param text toast 文本
-     * @param duration toast 显示时间, {@link Toast#LENGTH_SHORT} or {@link Toast#LENGTH_LONG}
-     */
-    private static void showOnMainThread(
-            @NonNull Context context, @NonNull CharSequence text, int duration) {
-        // 如果被拦截了,直接返回
-        if (interceptor != null && !interceptor.willToast(context, text, duration)) {
-            return;
-        }
-
-        // 9.0 以上直接用调用即可防止重复的显示的问题,且如果复用 Toast 会出现无法再出弹出对话框问题
-        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
-            Toast.makeText(context, text, duration).show();
-            return;
-        }
-
-        if (lastToast != null) {
-            lastToast.setText(text);
-        } else {
-            lastToast = Toast.makeText(context, text, duration);
-        }
-        lastToast.show();
-    }
-
-    /**
-     * 设置 toast 拦截器
-     *
-     * @param interceptor 拦截器 {@link ToastInterceptor}
-     * @discussion 如果想取消拦截,重新设置为 null 即可
-     */
-    public static void setInterceptor(@Nullable ToastInterceptor interceptor) {
-        ToastUtils.interceptor = interceptor;
-    }
-
-    /** SDK IMKit toast 拦截器 */
-    public interface ToastInterceptor {
-        /**
-         * 是否拦截
-         *
-         * @param context context
-         * @param text toast 文本
-         * @param duration toast 显示时间
-         * @return true:不拦截,由 SDK 弹 toast。false:拦截 SDK toast,由 App 自行弹 toast。
-         * @discussion 在 UI 线程调用
-         */
-        boolean willToast(@NonNull Context context, @NonNull CharSequence text, int duration);
-    }
-}

+ 4 - 4
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/keyboard/KeyboardHeightFloatImpl.kt

@@ -10,7 +10,7 @@ import android.view.View.OnLayoutChangeListener
 import android.view.ViewGroup
 import android.view.WindowManager
 import com.adealink.frame.imkit.model.TAG_IM_KEYBOARD
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
 import kotlin.math.abs
 
 class KeyboardHeightFloatImpl
@@ -22,7 +22,7 @@ class KeyboardHeightFloatImpl
     private var keyboardHeightObserver: KeyboardHeightObserver? = null
 
     init {
-        LogUtil.d(TAG_IM_KEYBOARD, "KeyboardHeightFloatImpl: ")
+        Log.d(TAG_IM_KEYBOARD, "KeyboardHeightFloatImpl: ")
         this.activity = activity
         this.windowManager = activity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
         this.view = View(activity)
@@ -39,7 +39,7 @@ class KeyboardHeightFloatImpl
                 windowManager.addView(view, createLayoutParams())
             }
         } catch (e: Exception) {
-            LogUtil.e(TAG_IM_KEYBOARD, "start" + e.message)
+            Log.e(TAG_IM_KEYBOARD, "start", e)
             view.removeOnLayoutChangeListener(this)
         }
     }
@@ -51,7 +51,7 @@ class KeyboardHeightFloatImpl
                 windowManager.removeViewImmediate(view)
             }
         } catch (e: Exception) {
-            LogUtil.e(TAG_IM_KEYBOARD, "stop" + e.message)
+            Log.e(TAG_IM_KEYBOARD, "stop" + e.message)
         }
     }
 

+ 3 - 3
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/keyboard/KeyboardHeightPopupImpl.kt

@@ -15,7 +15,7 @@ import android.view.WindowManager
 import android.widget.PopupWindow
 import com.adealink.frame.imkit.R
 import com.adealink.frame.imkit.model.TAG_IM_KEYBOARD
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
 import java.lang.ref.WeakReference
 
 class KeyboardHeightPopupImpl @SuppressLint("InflateParams") constructor(activity: Activity) :
@@ -39,7 +39,7 @@ class KeyboardHeightPopupImpl @SuppressLint("InflateParams") constructor(activit
     private var keyboardChangeAction: KeyboardChangeAction? = null
 
     init {
-        LogUtil.d(TAG_IM_KEYBOARD, "KeyboardHeightPopupImpl: ")
+        Log.d(TAG_IM_KEYBOARD, "KeyboardHeightPopupImpl: ")
         this.activity = activity
         val inflater =
             activity.getSystemService(Activity.LAYOUT_INFLATER_SERVICE) as LayoutInflater
@@ -82,7 +82,7 @@ class KeyboardHeightPopupImpl @SuppressLint("InflateParams") constructor(activit
                 try {
                     retryShowPopup(parent, gravity, x, y)
                 } catch (e: Exception) {
-                    LogUtil.e(TAG_IM_KEYBOARD, e.message ?: "")
+                    Log.e(TAG_IM_KEYBOARD, "retryShowPopup", e)
                     popupView.postDelayed(
                         Runnable {
                             if (activity.isFinishing || activity.isDestroyed) {

+ 7 - 7
frame/imkit/src/main/java/com/adealink/frame/imkit/utils/keyboard/KeyboardHeightProvider.kt

@@ -5,7 +5,7 @@ import android.content.Context
 import android.os.Build
 import android.provider.Settings
 import com.adealink.frame.imkit.model.TAG_IM_KEYBOARD
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
 import java.lang.reflect.Method
 import java.util.Locale
 
@@ -71,12 +71,12 @@ class KeyboardHeightProvider(activity: Activity) {
                 val method =
                     Settings::class.java.getDeclaredMethod("canDrawOverlays", Context::class.java) ?: return true
                 booleanValue = method.invoke(null, *arrayOf<Any>(context)) as Boolean
-                LogUtil.i(TAG_IM_KEYBOARD, "isFloatWindowOpAllowed allowed: $booleanValue")
+                Log.i(TAG_IM_KEYBOARD, "isFloatWindowOpAllowed allowed: $booleanValue")
                 return booleanValue
             } catch (e: NullPointerException) {
                 return true
             } catch (e: Exception) {
-                LogUtil.e(
+                Log.e(
                     TAG_IM_KEYBOARD,
                     String.format(
                         "getDeclaredMethod:canDrawOverlays! Error:%s, etype:%s",
@@ -93,7 +93,7 @@ class KeyboardHeightProvider(activity: Activity) {
                     Class.forName("android.app.AppOpsManager")
                         .getMethod("checkOp", Integer.TYPE, Integer.TYPE, String::class.java)
             } catch (e: NoSuchMethodException) {
-                LogUtil.e(
+                Log.e(
                     TAG_IM_KEYBOARD,
                     String.format(
                         "NoSuchMethodException method:checkOp! Error:%s", e.message
@@ -101,7 +101,7 @@ class KeyboardHeightProvider(activity: Activity) {
                 )
                 method = null
             } catch (e: ClassNotFoundException) {
-                LogUtil.e(TAG_IM_KEYBOARD, "canDrawOverlays, e:${e.message}")
+                Log.e(TAG_IM_KEYBOARD, "canDrawOverlays, e:${e.message}")
                 method = null
             }
             if (method != null) {
@@ -117,7 +117,7 @@ class KeyboardHeightProvider(activity: Activity) {
                         ) as? Int
                     result = tmp != null && tmp == 0
                 } catch (e: Exception) {
-                    LogUtil.e(
+                    Log.e(
                         TAG_IM_KEYBOARD,
                         String.format(
                             "call checkOp failed: %s etype:%s",
@@ -126,7 +126,7 @@ class KeyboardHeightProvider(activity: Activity) {
                     )
                 }
             }
-            LogUtil.i(TAG_IM_KEYBOARD, "isFloatWindowOpAllowed allowed: $result")
+            Log.i(TAG_IM_KEYBOARD, "isFloatWindowOpAllowed allowed: $result")
             return result
         }
         return true

+ 2 - 2
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/FixedLinearLayoutManager.kt

@@ -5,7 +5,7 @@ import android.util.AttributeSet
 import androidx.recyclerview.widget.LinearLayoutManager
 import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.imkit.model.TAG_IM_UI
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
 
 /** RecyclerView官方的BUG,继承封装LinearLayoutManager类,重写onLayoutChildren()方法,try-catch捕获该异常  */
 class FixedLinearLayoutManager : LinearLayoutManager {
@@ -28,7 +28,7 @@ class FixedLinearLayoutManager : LinearLayoutManager {
         try {
             super.onLayoutChildren(recycler, state)
         } catch (e: IndexOutOfBoundsException) {
-            LogUtil.e(TAG_IM_UI, "${e.message}")
+            Log.e(TAG_IM_UI, "onLayoutChildren", e)
         }
     }
 }

+ 5 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/BaseAdapter.kt

@@ -221,12 +221,16 @@ open class BaseAdapter<T> : RecyclerView.Adapter<ViewHolder> {
         }
     }
 
-
     override fun onViewDetachedFromWindow(holder: ViewHolder) {
         super.onViewDetachedFromWindow(holder)
         providerManager.getProvider(holder.itemViewType).onViewDetachedFromWindow(holder)
     }
 
+    override fun onViewRecycled(holder: ViewHolder) {
+        super.onViewRecycled(holder)
+        providerManager.getProvider(holder.itemViewType).onViewDetachedFromWindow(holder)
+    }
+
     companion object {
         private const val BASE_ITEM_TYPE_HEADER = -300
         private const val BASE_ITEM_TYPE_FOOTER = -400

+ 3 - 2
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/DefaultProvider.kt

@@ -1,13 +1,14 @@
 package com.adealink.frame.imkit.widget.adapter
 
+import android.annotation.SuppressLint
 import android.view.ViewGroup
 import android.widget.TextView
-import com.adealink.frame.imkit.R
 
 class DefaultProvider<T> : IViewProvider<T> {
+    @SuppressLint("SetTextI18n")
     override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
         val textView = TextView(parent.context)
-        textView.setText(R.string.rc_default_message)
+        textView.text = "The current version does not support viewing this message"
         return ViewHolder(parent.context, textView)
     }
 

+ 7 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/IViewProvider.kt

@@ -28,5 +28,11 @@ interface IViewProvider<T> {
 
     fun onViewAttachedToWindow(holder: ViewHolder) {}
 
-    fun onViewDetachedFromWindow(holder: ViewHolder) {}
+    fun onViewDetachedFromWindow(holder: ViewHolder) {
+        holder.clear()
+    }
+
+    fun onViewRecycled(holder: ViewHolder) {
+        holder.clear()
+    }
 }

+ 5 - 5
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/ProviderManager.kt

@@ -1,8 +1,8 @@
 package com.adealink.frame.imkit.widget.adapter
 
 import androidx.collection.SparseArrayCompat
-import com.adealink.frame.imkit.model.TAG_IM_MSG_PROVIDER
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.imkit.model.TAG_IM_UI
+import com.adealink.frame.log.Log
 
 class ProviderManager<T>() {
     val lock: Any = Any()
@@ -36,8 +36,8 @@ class ProviderManager<T>() {
         synchronized(lock) {
             val viewProvider = providers[viewType]
             if (viewProvider != null) {
-                LogUtil.e(
-                    TAG_IM_MSG_PROVIDER,
+                Log.e(
+                    TAG_IM_UI,
                     "An ItemViewProvider is already registered for the viewType = "
                             + viewType
                             + ". Already registered ItemViewProvider is "
@@ -60,7 +60,7 @@ class ProviderManager<T>() {
 
     fun removeProvider(provider: IViewProvider<T>?) {
         if (provider == null) {
-            LogUtil.e(TAG_IM_MSG_PROVIDER, "ItemViewProvider is null")
+            Log.e(TAG_IM_UI, "ItemViewProvider is null")
             return
         }
         val indexToRemove = providers.indexOfValue(provider)

+ 30 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/adapter/ViewHolder.kt

@@ -19,11 +19,24 @@ import android.widget.ProgressBar
 import android.widget.RatingBar
 import android.widget.TextView
 import androidx.recyclerview.widget.RecyclerView
+import com.adealink.frame.coroutine.dispatcher.Dispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.SupervisorJob
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.isActive
+import kotlinx.coroutines.launch
+import kotlin.coroutines.CoroutineContext
+import kotlin.coroutines.EmptyCoroutineContext
 
 open class ViewHolder(val context: Context, val convertView: View) : RecyclerView.ViewHolder(
     convertView
 ) {
     private val views = SparseArray<View?>()
+    private var viewHolderScope = CoroutineScope(
+        SupervisorJob() + Dispatcher.UI
+    )
 
     /**
      * 通过viewId获取控件
@@ -37,7 +50,23 @@ open class ViewHolder(val context: Context, val convertView: View) : RecyclerVie
             view = convertView.findViewById(viewId)
             views.put(viewId, view)
         }
-        return view as T?
+        return view as? T?
+    }
+
+    fun launch(
+        context: CoroutineContext = EmptyCoroutineContext,
+        block: suspend CoroutineScope.() -> Unit
+    ){
+        if (!viewHolderScope.isActive) {
+            viewHolderScope = CoroutineScope(
+                SupervisorJob() + Dispatcher.UI
+            )
+        }
+        viewHolderScope.launch(context, block = block)
+    }
+
+    fun clear() {
+        viewHolderScope.cancel()
     }
 
     // 以下为辅助方法

+ 0 - 566
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/menu/IMSwipeMenuLayout.kt

@@ -1,566 +0,0 @@
-package com.adealink.frame.imkit.widget.menu
-
-import android.animation.Animator
-import android.animation.AnimatorListenerAdapter
-import android.animation.ValueAnimator
-import android.annotation.SuppressLint
-import android.content.Context
-import android.graphics.PointF
-import android.util.AttributeSet
-import android.view.*
-import android.view.animation.AccelerateInterpolator
-import android.view.animation.OvershootInterpolator
-import com.adealink.frame.imkit.R
-import kotlin.math.abs
-
-/**
- * https://github.com/mcxtzhang/SwipeDelMenuLayout
- */
-class IMSwipeMenuLayout @JvmOverloads constructor(
-    context: Context,
-    attrs: AttributeSet? = null,
-    defStyleAttr: Int = 0
-) : ViewGroup(context, attrs, defStyleAttr) {
-
-    init {
-        init(context, attrs, defStyleAttr)
-    }
-
-    private var scaleTouchSlop = 0 //为了处理单击事件的冲突
-    private var maxVelocity = 0 //计算滑动速度用
-
-    private var pointerId = 0 //多点触摸只算第一根手指的速度
-
-    //右侧菜单宽度总和(最大滑动距离)
-    private var rightMenuWidths = 0
-
-    //滑动判定临界值(右侧菜单宽度的40%) 手指抬起时,超过了展开,没超过收起menu
-    private var limit = 0
-    private var contentView: View? = null //2016 11 13 add ,存储contentView(第一个View)
-
-    //上一次的xy
-    private val lastP = PointF()
-
-    //2016 10 22 add , 仿QQ,侧滑菜单展开时,点击除侧滑菜单之外的区域,关闭侧滑菜单。
-    //增加一个布尔值变量,dispatch函数里,每次down时,为true,move时判断,如果是滑动动作,设为false。
-    //在Intercept函数的up时,判断这个变量,如果仍为true 说明是点击事件,则关闭菜单。 
-    private var isUnMoved = true
-
-    //2016 11 03 add,判断手指起始落点,如果距离属于滑动了,就屏蔽一切点击事件。
-    //up-down的坐标,判断是否是滑动,如果是,则屏蔽一切点击事件
-    private val firstP = PointF()
-    private var isUserSwiped = false
-    private var velocityTracker: VelocityTracker? = null //滑动速度变量
-
-    /**
-     * 右滑删除功能的开关,默认开
-     */
-    private var isSwipeEnable = false
-
-    /**
-     * IOS、QQ式交互,默认开
-     */
-    private var isIos = false
-
-    private var iosInterceptFlag = false //IOS类型下,是否拦截事件的flag
-
-
-    /**
-     * 20160929add 左滑右滑的开关,默认左滑打开菜单
-     */
-    private var isLeftSwipe = false
-
-    /**
-     * 设置是否开启IOS阻塞式交互
-     */
-    fun withIos(ios: Boolean): IMSwipeMenuLayout {
-        isIos = ios
-        return this
-    }
-
-    /**
-     * 设置是否开启左滑出菜单,设置false 为右滑出菜单
-     */
-    fun withLeftSwipe(leftSwipe: Boolean): IMSwipeMenuLayout {
-        isLeftSwipe = leftSwipe
-        return this
-    }
-
-    /**
-     * 设置右滑删除功能的开关
-     */
-    fun withSwipeEnable(swipeEnable: Boolean): IMSwipeMenuLayout {
-        isSwipeEnable = swipeEnable
-        return this
-    }
-
-    private fun init(context: Context, attrs: AttributeSet?, defStyleAttr: Int) {
-        scaleTouchSlop = ViewConfiguration.get(context).scaledTouchSlop
-        maxVelocity = ViewConfiguration.get(context).scaledMaximumFlingVelocity
-        //初始化滑动帮助类对象
-        //mScroller = new Scroller(context);
-
-        //右滑删除功能的开关,默认开
-        isSwipeEnable = true
-        //IOS、QQ式交互,默认开
-        isIos = true
-        //左滑右滑的开关,默认左滑打开菜单
-        isLeftSwipe = true
-        val ta = context.theme.obtainStyledAttributes(
-            attrs,
-            R.styleable.IMSwipeMenuLayout,
-            defStyleAttr,
-            0
-        )
-        val count = ta.indexCount
-        for (i in 0 until count) {
-            val attr = ta.getIndex(i)
-            //如果引用成AndroidLib 资源都不是常量,无法使用switch case
-            if (attr == R.styleable.IMSwipeMenuLayout_swipeEnable) {
-                isSwipeEnable = ta.getBoolean(attr, true)
-            } else if (attr == R.styleable.IMSwipeMenuLayout_ios) {
-                isIos = ta.getBoolean(attr, true)
-            } else if (attr == R.styleable.IMSwipeMenuLayout_leftSwipe) {
-                isLeftSwipe = ta.getBoolean(attr, true)
-            }
-        }
-        ta.recycle()
-    }
-
-    override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
-        //Log.d(TAG, "onMeasure() called with: " + "widthMeasureSpec = [" + widthMeasureSpec + "], heightMeasureSpec = [" + heightMeasureSpec + "]");
-        super.onMeasure(widthMeasureSpec, heightMeasureSpec)
-        isClickable = true //令自己可点击,从而获取触摸事件
-        rightMenuWidths = 0 //由于ViewHolder的复用机制,每次这里要手动恢复初始值
-        //自己的高度
-        var height = 0
-        var contentWidth = 0 //2016 11 09 add,适配GridLayoutManager,将以第一个子Item(即ContentItem)的宽度为控件宽度
-        val childCount = childCount
-
-        //add by 2016 08 11 为了子View的高,可以matchParent(参考的FrameLayout 和LinearLayout的Horizontal)
-        val measureMatchParentChildren =
-            MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY
-        var isNeedMeasureChildHeight = false
-        for (i in 0 until childCount) {
-            val childView = getChildAt(i)
-            //令每一个子View可点击,从而获取触摸事件
-            childView.isClickable = true
-            if (childView.visibility != GONE) {
-                //后续计划加入上滑、下滑,则将不再支持Item的margin
-                measureChild(childView, widthMeasureSpec, heightMeasureSpec)
-                //measureChildWithMargins(childView, widthMeasureSpec, 0, heightMeasureSpec, 0);
-                val lp = childView.layoutParams as MarginLayoutParams
-                height =
-                    Math.max(height, childView.measuredHeight /* + lp.topMargin + lp.bottomMargin*/)
-                if (measureMatchParentChildren && lp.height == LayoutParams.MATCH_PARENT) {
-                    isNeedMeasureChildHeight = true
-                }
-                if (i > 0) { //第一个布局是Left item,从第二个开始才是RightMenu
-                    rightMenuWidths += childView.measuredWidth
-                } else {
-                    contentView = childView
-                    contentWidth = childView.measuredWidth
-                }
-            }
-        }
-        setMeasuredDimension(
-            paddingLeft + paddingRight + contentWidth,
-            height + paddingTop + paddingBottom
-        ) //宽度取第一个Item(Content)的宽度
-        limit = rightMenuWidths * 4 / 10 //滑动判断的临界值
-        //Log.d(TAG, "onMeasure() called with: " + "mRightMenuWidths = [" + mRightMenuWidths);
-        if (isNeedMeasureChildHeight) { //如果子View的height有MatchParent属性的,设置子View高度
-            forceUniformHeight(childCount, widthMeasureSpec)
-        }
-    }
-
-    override fun generateLayoutParams(attrs: AttributeSet): LayoutParams {
-        return MarginLayoutParams(context, attrs)
-    }
-
-    /**
-     * 给MatchParent的子View设置高度
-     */
-    private fun forceUniformHeight(count: Int, widthMeasureSpec: Int) {
-        // Pretend that the linear layout has an exact size. This is the measured height of
-        // ourselves. The measured height should be the max height of the children, changed
-        // to accommodate the heightMeasureSpec from the parent
-        val uniformMeasureSpec = MeasureSpec.makeMeasureSpec(
-            measuredHeight,
-            MeasureSpec.EXACTLY
-        ) //以父布局高度构建一个Exactly的测量参数
-        for (i in 0 until count) {
-            val child = getChildAt(i)
-            if (child.visibility != GONE) {
-                val lp = child.layoutParams as MarginLayoutParams
-                if (lp.height == LayoutParams.MATCH_PARENT) {
-                    // Temporarily force children to reuse their old measured width
-                    // FIXME: this may not be right for something like wrapping text?
-                    val oldWidth = lp.width //measureChildWithMargins 这个函数会用到宽,所以要保存一下
-                    lp.width = child.measuredWidth
-                    // Remeasure with new dimensions
-                    measureChildWithMargins(child, widthMeasureSpec, 0, uniformMeasureSpec, 0)
-                    lp.width = oldWidth
-                }
-            }
-        }
-    }
-
-    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
-        //LogUtils.e(TAG, "onLayout() called with: " + "changed = [" + changed + "], l = [" + l + "], t = [" + t + "], r = [" + r + "], b = [" + b + "]");
-        val childCount = childCount
-        var left = paddingLeft
-        var right = paddingLeft
-        for (i in 0 until childCount) {
-            val childView = getChildAt(i)
-            if (childView.visibility != GONE) {
-                if (i == 0) { //第一个子View是内容 宽度设置为全屏
-                    childView.layout(
-                        left,
-                        paddingTop,
-                        left + childView.measuredWidth,
-                        paddingTop + childView.measuredHeight
-                    )
-                    left = left + childView.measuredWidth
-                } else {
-                    if (isLeftSwipe) {
-                        childView.layout(
-                            left,
-                            paddingTop,
-                            left + childView.measuredWidth,
-                            paddingTop + childView.measuredHeight
-                        )
-                        left = left + childView.measuredWidth
-                    } else {
-                        childView.layout(
-                            right - childView.measuredWidth,
-                            paddingTop,
-                            right,
-                            paddingTop + childView.measuredHeight
-                        )
-                        right = right - childView.measuredWidth
-                    }
-                }
-            }
-        }
-    }
-
-    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
-        //LogUtils.d(TAG, "dispatchTouchEvent() called with: " + "ev = [" + ev + "]");
-        if (isSwipeEnable) {
-            acquireVelocityTracker(ev)
-            val verTracker = velocityTracker
-            when (ev.action) {
-                MotionEvent.ACTION_DOWN -> {
-                    isUserSwiped = false //2016 11 03 add,判断手指起始落点,如果距离属于滑动了,就屏蔽一切点击事件。
-                    isUnMoved = true //2016 10 22 add , 仿QQ,侧滑菜单展开时,点击内容区域,关闭侧滑菜单。
-                    iosInterceptFlag = false //add by 2016 09 11 ,每次DOWN时,默认是不拦截的
-                    if (isTouching) { //如果有别的指头摸过了,那么就return false。这样后续的move..等事件也不会再来找这个View了。
-                        return false
-                    } else {
-                        isTouching = true //第一个摸的指头,赶紧改变标志,宣誓主权。
-                    }
-                    lastP[ev.rawX] = ev.rawY
-                    firstP[ev.rawX] = ev.rawY //2016 11 03 add,判断手指起始落点,如果距离属于滑动了,就屏蔽一切点击事件。
-
-                    //如果down,view和cacheview不一样,则立马让它还原。且把它置为null
-                    if (viewCache != null) {
-                        if (viewCache !== this) {
-                            viewCache?.smoothClose()
-                            iosInterceptFlag =
-                                isIos //add by 2016 09 11 ,IOS模式开启的话,且当前有侧滑菜单的View,且不是自己的,就该拦截事件咯。
-                        }
-                        //只要有一个侧滑菜单处于打开状态, 就不给外层布局上下滑动了
-                        parent.requestDisallowInterceptTouchEvent(true)
-                    }
-                    //求第一个触点的id, 此时可能有多个触点,但至少一个,计算滑动速率用
-                    pointerId = ev.getPointerId(0)
-                }
-                MotionEvent.ACTION_MOVE -> {
-                    //add by 2016 09 11 ,IOS模式开启的话,且当前有侧滑菜单的View,且不是自己的,就该拦截事件咯。滑动也不该出现
-                    if (!iosInterceptFlag) {
-                        //view没有展示时外层滑动冲突解决
-                        val gap = lastP.x - ev.rawX
-                        val flag = isLeftSwipe && scrollX == 0 && gap < 0
-                        if (!flag) {
-                            //为了在水平滑动中禁止父类ListView等再竖直滑动
-                            if (abs(gap) > 10 || abs(scrollX) > 10) { //2016 09 29 修改此处,使屏蔽父布局滑动更加灵敏,
-                                parent.requestDisallowInterceptTouchEvent(true)
-                            }
-                            //2016 10 22 add , 仿QQ,侧滑菜单展开时,点击内容区域,关闭侧滑菜单。begin
-                            if (abs(gap) > scaleTouchSlop) {
-                                isUnMoved = false
-                            }
-                            //2016 10 22 add , 仿QQ,侧滑菜单展开时,点击内容区域,关闭侧滑菜单。end
-                            //如果scroller还没有滑动结束 停止滑动动画
-                            scrollBy(gap.toInt(), 0) //滑动使用scrollBy
-                            //越界修正
-                            if (isLeftSwipe) { //左滑
-                                if (scrollX < 0) {
-                                    scrollTo(0, 0)
-                                }
-                                if (scrollX > rightMenuWidths) {
-                                    scrollTo(rightMenuWidths, 0)
-                                }
-                            } else { //右滑
-                                if (scrollX < -rightMenuWidths) {
-                                    scrollTo(-rightMenuWidths, 0)
-                                }
-                                if (scrollX > 0) {
-                                    scrollTo(0, 0)
-                                }
-                            }
-                            lastP[ev.rawX] = ev.rawY
-                        }
-                    }
-                }
-                MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
-                    //2016 11 03 add,判断手指起始落点,如果距离属于滑动了,就屏蔽一切点击事件。
-                    if (abs(ev.rawX - firstP.x) > scaleTouchSlop) {
-                        isUserSwiped = true
-                    }
-
-                    //add by 2016 09 11 ,IOS模式开启的话,且当前有侧滑菜单的View,且不是自己的,就该拦截事件咯。滑动也不该出现
-                    if (!iosInterceptFlag) { //且滑动了 才判断是否要收起、展开menu
-                        //求伪瞬时速度
-                        verTracker?.computeCurrentVelocity(1000, maxVelocity.toFloat())
-                        val velocityX = verTracker?.getXVelocity(pointerId) ?: 0f
-                        if (abs(velocityX) > 1000) { //滑动速度超过阈值
-                            if (velocityX < -1000) {
-                                if (isLeftSwipe) { //左滑
-                                    //平滑展开Menu
-                                    smoothExpand()
-                                } else {
-                                    //平滑关闭Menu
-                                    smoothClose()
-                                }
-                            } else {
-                                if (isLeftSwipe) { //左滑
-                                    // 平滑关闭Menu
-                                    smoothClose()
-                                } else {
-                                    //平滑展开Menu
-                                    smoothExpand()
-                                }
-                            }
-                        } else {
-                            if (Math.abs(scrollX) > limit) { //否则就判断滑动距离
-                                //平滑展开Menu
-                                smoothExpand()
-                            } else {
-                                // 平滑关闭Menu
-                                smoothClose()
-                            }
-                        }
-                    }
-                    //释放
-                    releaseVelocityTracker()
-                    //LogUtils.i(TAG, "onTouch A ACTION_UP ACTION_CANCEL:velocityY:" + velocityX);
-                    isTouching = false //没有手指在摸我了
-                }
-                else -> {
-                }
-            }
-        }
-        return super.dispatchTouchEvent(ev)
-    }
-
-    override fun onInterceptTouchEvent(ev: MotionEvent): Boolean {
-        //Log.d(TAG, "onInterceptTouchEvent() called with: ev = [" + ev + "]");
-        //add by zhangxutong 2016 12 07 begin:
-        //禁止侧滑时,点击事件不受干扰。
-        if (isSwipeEnable) {
-            when (ev.action) {
-                MotionEvent.ACTION_MOVE ->                     //屏蔽滑动时的事件
-                    if (Math.abs(ev.rawX - firstP.x) > scaleTouchSlop) {
-                        return true
-                    }
-                MotionEvent.ACTION_UP -> {
-                    //为了在侧滑时,屏蔽子View的点击事件
-                    if (isLeftSwipe) {
-                        if (scrollX > scaleTouchSlop) {
-                            //add by 2016 09 10 解决一个智障问题~ 居然不给点击侧滑菜单 我跪着谢罪
-                            //这里判断落点在内容区域屏蔽点击,内容区域外,允许传递事件继续向下的的。。。
-                            if (ev.x < width - scrollX) {
-                                //2016 10 22 add , 仿QQ,侧滑菜单展开时,点击内容区域,关闭侧滑菜单。
-                                if (isUnMoved) {
-                                    smoothClose()
-                                }
-                                return true //true表示拦截
-                            }
-                        }
-                    } else {
-                        if (-scrollX > scaleTouchSlop) {
-                            if (ev.x > -scrollX) { //点击范围在菜单外 屏蔽
-                                //2016 10 22 add , 仿QQ,侧滑菜单展开时,点击内容区域,关闭侧滑菜单。
-                                if (isUnMoved) {
-                                    smoothClose()
-                                }
-                                return true
-                            }
-                        }
-                    }
-                    //add by zhangxutong 2016 11 03 begin:
-                    // 判断手指起始落点,如果距离属于滑动了,就屏蔽一切点击事件。
-                    if (isUserSwiped) {
-                        return true
-                    }
-                }
-            }
-            //模仿IOS 点击其他区域关闭:
-            if (iosInterceptFlag) {
-                //IOS模式开启,且当前有菜单的View,且不是自己的 拦截点击事件给子View
-                return true
-            }
-        }
-        return super.onInterceptTouchEvent(ev)
-    }
-
-    /**
-     * 平滑展开
-     */
-    private var mExpandAnim: ValueAnimator? = null
-    private var mCloseAnim: ValueAnimator? = null
-
-    //代表当前是否是展开状态 2016 11 03 add
-    private var isExpand = false
-
-    private fun smoothExpand() {
-        //展开就加入ViewCache
-        viewCache = this@IMSwipeMenuLayout
-
-        //2016 11 13 add 侧滑菜单展开,屏蔽content长按
-        if (null != contentView) {
-            contentView?.isLongClickable = false
-        }
-        cancelAnim()
-        mExpandAnim =
-            ValueAnimator.ofInt(scrollX, if (isLeftSwipe) rightMenuWidths else -rightMenuWidths)
-        mExpandAnim?.addUpdateListener { animation: ValueAnimator ->
-            scrollTo(
-                (animation.animatedValue as Int), 0
-            )
-        }
-        mExpandAnim?.interpolator = OvershootInterpolator()
-        mExpandAnim?.addListener(object : AnimatorListenerAdapter() {
-            override fun onAnimationEnd(animation: Animator) {
-                isExpand = true
-            }
-        })
-        mExpandAnim?.setDuration(300)?.start()
-    }
-
-    /**
-     * 每次执行动画之前都应该先取消之前的动画
-     */
-    private fun cancelAnim() {
-        if (mCloseAnim?.isRunning == true) {
-            mCloseAnim?.cancel()
-        }
-        if (mExpandAnim?.isRunning == true) {
-            mExpandAnim?.cancel()
-        }
-    }
-
-    /**
-     * 平滑关闭
-     */
-    fun smoothClose() {
-        //Log.d(TAG, "smoothClose() called" + this);
-/*        mScroller.startScroll(getScrollX(), 0, -getScrollX(), 0);
-        invalidate();*/
-        viewCache = null
-
-        //2016 11 13 add 侧滑菜单展开,屏蔽content长按
-        if (null != contentView) {
-            contentView?.isLongClickable = true
-        }
-        cancelAnim()
-        mCloseAnim = ValueAnimator.ofInt(scrollX, 0)
-        mCloseAnim?.addUpdateListener { animation: ValueAnimator ->
-            scrollTo(
-                (animation.animatedValue as Int), 0
-            )
-        }
-        mCloseAnim?.interpolator = AccelerateInterpolator()
-        mCloseAnim?.addListener(object : AnimatorListenerAdapter() {
-            override fun onAnimationEnd(animation: Animator) {
-                isExpand = false
-            }
-        })
-        mCloseAnim?.setDuration(300)?.start()
-    }
-
-    /**
-     * @param event 向VelocityTracker添加MotionEvent
-     * @see VelocityTracker.obtain
-     * @see VelocityTracker.addMovement
-     */
-    private fun acquireVelocityTracker(event: MotionEvent) {
-        if (null == velocityTracker) {
-            velocityTracker = VelocityTracker.obtain()
-        }
-        velocityTracker?.addMovement(event)
-    }
-
-    /**
-     * * 释放VelocityTracker
-     *
-     * @see VelocityTracker.clear
-     * @see VelocityTracker.recycle
-     */
-    private fun releaseVelocityTracker() {
-        if (null != velocityTracker) {
-            velocityTracker?.clear()
-            velocityTracker?.recycle()
-            velocityTracker = null
-        }
-    }
-
-    //每次ViewDetach的时候,判断一下 ViewCache是不是自己,如果是自己,关闭侧滑菜单,且ViewCache设置为null,
-    // 理由:1 防止内存泄漏(ViewCache是一个静态变量)
-    // 2 侧滑删除后自己后,这个View被Recycler回收,复用,下一个进入屏幕的View的状态应该是普通状态,而不是展开状态。
-    override fun onDetachedFromWindow() {
-        if (this === viewCache) {
-            viewCache?.smoothClose()
-            viewCache = null
-        }
-        super.onDetachedFromWindow()
-    }
-
-    //展开时,禁止长按
-    override fun performLongClick(): Boolean {
-        return if (Math.abs(scrollX) > scaleTouchSlop) {
-            false
-        } else super.performLongClick()
-    }
-
-    /**
-     * 快速关闭。
-     * 用于 点击侧滑菜单上的选项,同时想让它快速关闭(删除 置顶)。
-     * 这个方法在ListView里是必须调用的,
-     * 在RecyclerView里,视情况而定,如果是mAdapter.notifyItemRemoved(pos)方法不用调用。
-     */
-    fun quickClose() {
-        if (this === viewCache) {
-            //先取消展开动画
-            cancelAnim()
-            viewCache?.scrollTo(0, 0) //关闭
-            viewCache = null
-        }
-    }
-
-    fun forceExpand(){
-        smoothExpand()
-    }
-
-    companion object {
-        //存储的是当前正在展开的View
-        @SuppressLint("StaticFieldLeak")
-        var viewCache: IMSwipeMenuLayout? = null
-
-        //防止多只手指一起滑我的flag 在每次down里判断, touch事件结束清空
-        private var isTouching = false
-    }
-
-}

+ 0 - 70
frame/imkit/src/main/java/com/adealink/frame/imkit/widget/refresh/IMRefreshHeader.java

@@ -1,70 +0,0 @@
-package com.adealink.frame.imkit.widget.refresh;
-
-import android.content.Context;
-import android.graphics.drawable.Animatable;
-import android.graphics.drawable.Drawable;
-import android.util.AttributeSet;
-import android.view.View;
-import android.widget.ImageView;
-
-import androidx.annotation.NonNull;
-
-import com.adealink.frame.imkit.R;
-import com.scwang.smart.refresh.layout.api.RefreshFooter;
-import com.scwang.smart.refresh.layout.api.RefreshHeader;
-import com.scwang.smart.refresh.layout.api.RefreshLayout;
-import com.scwang.smart.refresh.layout.simple.SimpleComponent;
-
-public class IMRefreshHeader extends SimpleComponent implements RefreshHeader, RefreshFooter {
-
-    protected ImageView mProgressView;
-
-    public IMRefreshHeader(Context context) {
-        this(context, null);
-    }
-
-    public IMRefreshHeader(Context context, AttributeSet attrs) {
-        this(context, attrs, 0);
-    }
-
-    public IMRefreshHeader(Context context, AttributeSet attrs, int defStyleAttr) {
-        super(context, attrs, defStyleAttr);
-        View.inflate(context, R.layout.im_refresh_header, this);
-        mProgressView = findViewById(R.id.rc_refresh_progress);
-        final Drawable drawable = mProgressView.getDrawable();
-        if (drawable instanceof Animatable) {
-            if (((Animatable) drawable).isRunning()) {
-                ((Animatable) drawable).stop();
-            }
-        }
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        final Drawable drawable = mProgressView.getDrawable();
-        if (drawable instanceof Animatable) {
-            if (((Animatable) drawable).isRunning()) {
-                ((Animatable) drawable).stop();
-            }
-        }
-    }
-
-    @Override
-    public int onFinish(@NonNull RefreshLayout refreshLayout, boolean success) {
-        Drawable drawable = mProgressView.getDrawable();
-        if (drawable instanceof Animatable) {
-            ((Animatable) drawable).stop();
-        }
-        return super.onFinish(refreshLayout, success);
-    }
-
-    @Override
-    public void onStartAnimator(
-            @NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) {
-        Drawable drawable = mProgressView.getDrawable();
-        if (drawable instanceof Animatable) {
-            ((Animatable) drawable).start();
-        }
-    }
-}

+ 136 - 0
frame/imkit/src/main/res/values-ar/string.xml

@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!--emoji description 128 total start-->
+    <string name="rc_emoji_smiley_face">وجه مبتسم</string><!--1-->
+    <string name="rc_emoji_grinning_face">وجه مبتسم</string><!--2-->
+    <string name="rc_emoji_smiley">مبتسم</string><!--3-->
+    <string name="rc_emoji_cute">جذاب</string><!--4-->
+    <string name="rc_emoji_winking_face">وجه غامز</string><!--5-->
+    <string name="rc_emoji_heart_eyes">عيون قلوب</string><!--6-->
+    <string name="rc_emoji_blowing_kiss">نفخ قبلة</string><!--7-->
+    <string name="rc_emoji_kiss_face">قبلة الوجه</string><!--8-->
+    <string name="rc_emoji_crazy_face">وجه مجنون</string><!--9-->
+    <string name="rc_emoji_tongue_out">اللسان خارجا</string><!--10-->
+    <string name="rc_emoji_flushed_face">وجه متوهج</string><!--11-->
+    <string name="rc_emoji_grinning_with_smiling">يبتسم إبتسامة عريضة</string><!--12-->
+    <string name="rc_emoji_pensive">متأمل</string><!--13-->
+    <string name="rc_emoji_pleased">مسرور</string><!--14-->
+    <string name="rc_emoji_dissatisfied">غير راض</string><!--15-->
+    <string name="rc_emoji_worried_face">وجه قلق</string><!--16-->
+    <string name="rc_emoji_disappointed_face">الوجه بخيبة أمل</string><!--17-->
+    <string name="rc_emoji_helpless_face">وجه يرثى له</string><!--18-->
+    <string name="rc_emoji_crying">بكاء</string><!--19-->
+    <string name="rc_emoji_laughing_tears">يضحك دموع</string><!--20-->
+    <string name="rc_emoji_sobbing">ينتحب</string><!--21-->
+    <string name="rc_emoji_sleepy_face">وجه نائم</string><!--22-->
+    <string name="rc_emoji_cold_sweat">عرق بارد</string><!--23-->
+    <string name="rc_emoji_happy_sweat">عرق سعيد</string><!--24-->
+    <string name="rc_emoji_sweat">معرق</string><!--25-->
+    <string name="rc_emoji_tired_face">وجه متعب</string><!--26-->
+    <string name="rc_emoji_weary_face">الوجه المتعب</string><!--27-->
+    <string name="rc_emoji_fearful_face">وجه خائف</string><!--28-->
+    <string name="rc_emoji_scream">صراخ</string><!--29-->
+    <string name="rc_emoji_angry_face">وجه غاضب</string><!--30-->
+    <string name="rc_emoji_mad_face">وجه غاضب</string><!--31-->
+    <string name="rc_emoji_confounded_face">وجه مرتبك</string><!--32-->
+    <string name="rc_emoji_big_grin">ابتسامة كبيرة</string><!--33-->
+    <string name="rc_emoji_hungry">جوعان</string><!--34-->
+    <string name="rc_emoji_mask_face">قناع الوجه</string><!--35-->
+    <string name="rc_emoji_sunglasses">لابس نظارة</string><!--36-->
+    <string name="rc_emoji_sleeping">نائم</string><!--37-->
+    <string name="rc_emoji_shocked_face">وجه مصدوم</string><!--38-->
+    <string name="rc_emoji_dizzy_face">وجه دائخ</string><!--39-->
+    <string name="rc_emoji_purple_devil">وجه شيطاني</string><!--40-->
+    <string name="rc_emoji_devil">وجه شيطاني</string><!--41-->
+    <string name="rc_emoji_surprised_face">وجه متفاجئ</string><!--42-->
+    <string name="rc_emoji_grimacing_face">وجه متفاجئ</string><!--43-->
+    <string name="rc_emoji_confused">مشوش</string><!--44-->
+    <string name="rc_emoji_mouthless">بدون فم</string><!--45-->
+    <string name="rc_emoji_halo">هالو</string><!--46-->
+    <string name="rc_emoji_smirking_face">وجه حذق</string><!--47-->
+    <string name="rc_emoji_expressionless_face">وجه بلا تعابير</string><!--48-->
+    <string name="rc_emoji_see_no_monkey">قرد1</string><!--49-->
+    <string name="rc_emoji_hear_no_monkey">قرد2</string><!--50-->
+    <string name="rc_emoji_no_speaking">ممنوع الكلام</string><!--51-->
+    <string name="rc_emoji_alien">كائن فضائي</string><!--52-->
+    <string name="rc_emoji_pile_of_poo">كومة</string><!--53-->
+    <string name="rc_emoji_broken_heart">قلب مجروح</string><!--54-->
+    <string name="rc_emoji_fire">نار</string><!--55-->
+    <string name="rc_emoji_anger">غضب</string><!--56-->
+    <string name="rc_emoji_zzz">نعاس</string><!--57-->
+    <string name="rc_emoji_prohibited">محظور</string><!--58-->
+    <string name="rc_emoji_star">نجمة</string><!--59-->
+    <string name="rc_emoji_lightning_bolt">برق</string><!--60-->
+    <string name="rc_emoji_crescent_moon">الهلال</string><!--61-->
+    <string name="rc_emoji_sunny">مشمس</string><!--62-->
+    <string name="rc_emoji_cloudy">غائم</string><!--63-->
+    <string name="rc_emoji_cloud">غيم</string><!--64-->
+    <string name="rc_emoji_snowflake">رقائق ثلج</string><!--65-->
+    <string name="rc_emoji_umbrella">مظلة</string><!--66-->
+    <string name="rc_emoji_snowman">الرجل الثلجي</string><!--67-->
+    <string name="rc_emoji_thumbs_up">رضى</string><!--68-->
+    <string name="rc_emoji_thumbs_down">غير راض</string><!--69-->
+    <string name="rc_emoji_shake_hand">هزة اليد</string><!--70-->
+    <string name="rc_emoji_ok_hand">يد أتفق</string><!--71-->
+    <string name="rc_emoji_oncoming_fist">قبضة قادمة</string><!--72-->
+    <string name="rc_emoji_raised_fist">قبضة مرفوعة</string><!--73-->
+    <string name="rc_emoji_victory_hand">يد الفوز</string><!--74-->
+    <string name="rc_emoji_raised_hand">يد مرفوعة</string><!--75-->
+    <string name="rc_emoji_folded_hands">الأيدي مطوية</string><!--76-->
+    <string name="rc_emoji_pointing_up">مشيرا أعلى</string><!--77-->
+    <string name="rc_emoji_clapping_hands">تصفيق</string><!--78-->
+    <string name="rc_emoji_flexed_biceps">عضلات</string><!--79-->
+    <string name="rc_emoji_family">أسرة</string><!--80-->
+    <string name="rc_emoji_couple">زوجان</string><!--81-->
+    <string name="rc_emoji_baby_angel">الطفل الملاك</string><!--82-->
+    <string name="rc_emoji_horse">حصان</string><!--83-->
+    <string name="rc_emoji_dog">كلب</string><!--84-->
+    <string name="rc_emoji_pig">خنزير</string><!--85-->
+    <string name="rc_emoji_ghost">شبح</string><!--86-->
+    <string name="rc_emoji_rose">وردة</string><!--87-->
+    <string name="rc_emoji_sunflower">دوار الشمس</string><!--88-->
+    <string name="rc_emoji_pine_tree">شجرة الصنوبر</string><!--89-->
+    <string name="rc_emoji_christmas_tree">شجرة الميلاد</string><!--90-->
+    <string name="rc_emoji_wrapped_gift">لف هدية</string><!--91-->
+    <string name="rc_emoji_party_popper">حفلة</string><!--92-->
+    <string name="rc_emoji_money_bag">حقيبة المال</string><!--93-->
+    <string name="rc_emoji_birthday_cake">كعكة عيد الميلاد</string><!--94-->
+    <string name="rc_emoji_barbecue">الشواء</string><!--95-->
+    <string name="rc_emoji_cooked_rice">ارز مطبوخ</string><!--96-->
+    <string name="rc_emoji_ice_cream">آيسكريم</string><!--97-->
+    <string name="rc_emoji_chocolate_bar">قطعة شوكولاتة</string><!--98-->
+    <string name="rc_emoji_watermelon">البطيخ</string><!--99-->
+    <string name="rc_emoji_wine_glass">كأس</string><!--100-->
+    <string name="rc_emoji_cheers">المرحى</string><!--101-->
+    <string name="rc_emoji_coffee">قهوة</string><!--102-->
+    <string name="rc_emoji_basketball">كرة سلة</string><!--103-->
+    <string name="rc_emoji_soccer_ball">كرة القدم</string><!--104-->
+    <string name="rc_emoji_snowboarder">المتزلج</string><!--105-->
+    <string name="rc_emoji_microphone">ميكروفون</string><!--106-->
+    <string name="rc_emoji_musical_note">نوتة موسيقية</string><!--107-->
+    <string name="rc_emoji_game_die">لعبة الموت</string><!--108-->
+    <string name="rc_emoji_mahjone_red_dragon">جونغ التنين الاحمر</string><!--109-->
+    <string name="rc_emoji_crown">تاج</string><!--110-->
+    <string name="rc_emoji_lipstick">أحمر الشفاه</string><!--111-->
+    <string name="rc_emoji_kiss">قبلة</string><!--112-->
+    <string name="rc_emoji_ring">حلقة</string><!--113-->
+    <string name="rc_emoji_books">كتب</string><!--114-->
+    <string name="rc_emoji_graduation_cap">قبعة التخرج</string><!--115-->
+    <string name="rc_emoji_pencil">قلم</string><!--116-->
+    <string name="rc_emoji_house_with_garden">منزل مع حديقة</string><!--117-->
+    <string name="rc_emoji_shower">دش</string><!--118-->
+    <string name="rc_emoji_light_bulb">المصباح الكهربائي</string><!--119-->
+    <string name="rc_emoji_telephone_receiver">الهاتف استقبال</string><!--120-->
+    <string name="rc_emoji_loudspeaker">مكبر الصوت</string><!--121-->
+    <string name="rc_emoji_clock">ساعة حائط</string><!--122-->
+    <string name="rc_emoji_alarm_clock">منبه</string><!--123-->
+    <string name="rc_emoji_hourglass">الساعة الرملية</string><!--124-->
+    <string name="rc_emoji_bomb">قنبلة</string><!--125-->
+    <string name="rc_emoji_pistol">مسدس</string><!--126-->
+    <string name="rc_emoji_capsule">كبسولة</string><!--127-->
+    <string name="rc_emoji_rocket">صاروخ</string><!--128-->
+    <string name="rc_emoji_globe">كره ارضيه</string><!--129-->
+    <string name="rc_emoji_love_heart">حب</string><!--130-->
+
+    <!--emoji description 128 total end-->
+</resources>

+ 135 - 0
frame/imkit/src/main/res/values-zh/string.xml

@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    //emoji
+    <!--emoji 对应的文字描述 共 128 个 start-->
+    <string name="rc_emoji_smiley_face">笑脸</string>><!--1-->
+    <string name="rc_emoji_grinning_face">笑嘻嘻</string><!--2-->
+    <string name="rc_emoji_smiley">微笑</string><!--3-->
+    <string name="rc_emoji_cute">萌萌哒</string><!--4-->
+    <string name="rc_emoji_winking_face">眨眼</string><!--5-->
+    <string name="rc_emoji_heart_eyes">色眯眯</string><!--6-->
+    <string name="rc_emoji_blowing_kiss">飞吻</string><!--7-->
+    <string name="rc_emoji_kiss_face">么么哒</string><!--8-->
+    <string name="rc_emoji_crazy_face">调皮</string><!--9-->
+    <string name="rc_emoji_tongue_out">吐舌头</string><!--10-->
+    <string name="rc_emoji_flushed_face">脸红</string><!--11-->
+    <string name="rc_emoji_grinning_with_smiling">露齿而笑</string><!--12-->
+    <string name="rc_emoji_pensive">沉思</string><!--13-->
+    <string name="rc_emoji_pleased">满意</string><!--14-->
+    <string name="rc_emoji_dissatisfied">不满</string><!--15-->
+    <string name="rc_emoji_worried_face">苦瓜脸</string><!--16-->
+    <string name="rc_emoji_disappointed_face">失望</string><!--17-->
+    <string name="rc_emoji_helpless_face">无助</string><!--18-->
+    <string name="rc_emoji_crying">伤心</string><!--19-->
+    <string name="rc_emoji_laughing_tears">喜极而泣</string><!--20-->
+    <string name="rc_emoji_sobbing">哭泣</string><!--21-->
+    <string name="rc_emoji_sleepy_face">困</string><!--22-->
+    <string name="rc_emoji_cold_sweat">冷汗</string><!--23-->
+    <string name="rc_emoji_happy_sweat">尴尬</string><!--24-->
+    <string name="rc_emoji_sweat">汗</string><!--25-->
+    <string name="rc_emoji_tired_face">抓狂</string><!--26-->
+    <string name="rc_emoji_weary_face">疲惫</string><!--27-->
+    <string name="rc_emoji_fearful_face">可怕</string><!--28-->
+    <string name="rc_emoji_scream">尖叫</string><!--29-->
+    <string name="rc_emoji_angry_face">生气</string><!--30-->
+    <string name="rc_emoji_mad_face">怒气冲冲</string><!--31-->
+    <string name="rc_emoji_confounded_face">蒙羞</string><!--32-->
+    <string name="rc_emoji_big_grin">大笑</string><!--33-->
+    <string name="rc_emoji_hungry">馋</string><!--34-->
+    <string name="rc_emoji_mask_face">口罩</string><!--35-->
+    <string name="rc_emoji_sunglasses">墨镜</string><!--36-->
+    <string name="rc_emoji_sleeping">睡眠</string><!--37-->
+    <string name="rc_emoji_shocked_face">震惊</string><!--38-->
+    <string name="rc_emoji_dizzy_face">头晕眼花</string><!--39-->
+    <string name="rc_emoji_purple_devil">小恶魔</string><!--40-->
+    <string name="rc_emoji_devil">恶魔</string><!--41-->
+    <string name="rc_emoji_surprised_face">惊呆</string><!--42-->
+    <string name="rc_emoji_grimacing_face">扮鬼脸</string><!--43-->
+    <string name="rc_emoji_confused">困惑</string><!--44-->
+    <string name="rc_emoji_mouthless">无口</string><!--45-->
+    <string name="rc_emoji_halo">天使光环</string><!--46-->
+    <string name="rc_emoji_smirking_face">傻笑</string><!--47-->
+    <string name="rc_emoji_expressionless_face">面无表情</string><!--48-->
+    <string name="rc_emoji_see_no_monkey">不看</string><!--49-->
+    <string name="rc_emoji_hear_no_monkey">不听</string><!--50-->
+    <string name="rc_emoji_no_speaking">闭嘴</string><!--51-->
+    <string name="rc_emoji_alien">外星人</string><!--52-->
+    <string name="rc_emoji_pile_of_poo">便便</string><!--53-->
+    <string name="rc_emoji_broken_heart">心碎</string><!--54-->
+    <string name="rc_emoji_fire">火</string><!--55-->
+    <string name="rc_emoji_anger">愤怒</string><!--56-->
+    <string name="rc_emoji_zzz">ZZZ</string><!--57-->
+    <string name="rc_emoji_prohibited">禁止</string><!--58-->
+    <string name="rc_emoji_star">星星</string><!--59-->
+    <string name="rc_emoji_lightning_bolt">闪电</string><!--60-->
+    <string name="rc_emoji_crescent_moon">弯月</string><!--61-->
+    <string name="rc_emoji_sunny">晴朗</string><!--62-->
+    <string name="rc_emoji_cloudy">多云</string><!--63-->
+    <string name="rc_emoji_cloud">云彩</string><!--64-->
+    <string name="rc_emoji_snowflake">雪花</string><!--65-->
+    <string name="rc_emoji_umbrella">雨伞</string><!--66-->
+    <string name="rc_emoji_snowman">雪人</string><!--67-->
+    <string name="rc_emoji_thumbs_up">赞</string><!--68-->
+    <string name="rc_emoji_thumbs_down">喝倒彩</string><!--69-->
+    <string name="rc_emoji_shake_hand">握手</string><!--70-->
+    <string name="rc_emoji_ok_hand">没问题</string><!--71-->
+    <string name="rc_emoji_oncoming_fist">击拳</string><!--72-->
+    <string name="rc_emoji_raised_fist">举起拳头</string><!--73-->
+    <string name="rc_emoji_victory_hand">耶</string><!--74-->
+    <string name="rc_emoji_raised_hand">举手</string><!--75-->
+    <string name="rc_emoji_folded_hands">祈祷</string><!--76-->
+    <string name="rc_emoji_pointing_up">第一</string><!--77-->
+    <string name="rc_emoji_clapping_hands">鼓掌</string><!--78-->
+    <string name="rc_emoji_flexed_biceps">肌肉</string><!--79-->
+    <string name="rc_emoji_family">家庭</string><!--80-->
+    <string name="rc_emoji_couple">情侣</string><!--81-->
+    <string name="rc_emoji_baby_angel">宝贝天使</string><!--82-->
+    <string name="rc_emoji_horse">马</string><!--83-->
+    <string name="rc_emoji_dog">狗</string><!--84-->
+    <string name="rc_emoji_pig">猪</string><!--85-->
+    <string name="rc_emoji_ghost">鬼</string><!--86-->
+    <string name="rc_emoji_rose">玫瑰</string><!--87-->
+    <string name="rc_emoji_sunflower">向日葵</string><!--88-->
+    <string name="rc_emoji_pine_tree">松树</string><!--89-->
+    <string name="rc_emoji_christmas_tree">圣诞树</string><!--90-->
+    <string name="rc_emoji_wrapped_gift">礼物</string><!--91-->
+    <string name="rc_emoji_party_popper">聚会礼花</string><!--92-->
+    <string name="rc_emoji_money_bag">钱袋</string><!--93-->
+    <string name="rc_emoji_birthday_cake">生日蛋糕</string><!--94-->
+    <string name="rc_emoji_barbecue">BBQ</string><!--95-->
+    <string name="rc_emoji_cooked_rice">米饭</string><!--96-->
+    <string name="rc_emoji_ice_cream">冰淇淋</string><!--97-->
+    <string name="rc_emoji_chocolate_bar">巧克力</string><!--98-->
+    <string name="rc_emoji_watermelon">西瓜</string><!--99-->
+    <string name="rc_emoji_wine_glass">红酒</string><!--100-->
+    <string name="rc_emoji_cheers">干杯</string><!--101-->
+    <string name="rc_emoji_coffee">咖啡</string><!--102-->
+    <string name="rc_emoji_basketball">篮球</string><!--103-->
+    <string name="rc_emoji_soccer_ball">足球</string><!--104-->
+    <string name="rc_emoji_snowboarder">单板滑雪</string><!--105-->
+    <string name="rc_emoji_microphone">麦克风</string><!--106-->
+    <string name="rc_emoji_musical_note">音乐</string><!--107-->
+    <string name="rc_emoji_game_die">骰子</string><!--108-->
+    <string name="rc_emoji_mahjone_red_dragon">麻将</string><!--109-->
+    <string name="rc_emoji_crown">王冠</string><!--110-->
+    <string name="rc_emoji_lipstick">口红</string><!--111-->
+    <string name="rc_emoji_kiss">吻</string><!--112-->
+    <string name="rc_emoji_ring">戒指</string><!--113-->
+    <string name="rc_emoji_books">书籍</string><!--114-->
+    <string name="rc_emoji_graduation_cap">毕业帽</string><!--115-->
+    <string name="rc_emoji_pencil">铅笔</string><!--116-->
+    <string name="rc_emoji_house_with_garden">房子</string><!--117-->
+    <string name="rc_emoji_shower">淋浴</string><!--118-->
+    <string name="rc_emoji_light_bulb">灯泡</string><!--119-->
+    <string name="rc_emoji_telephone_receiver">电话听筒</string><!--120-->
+    <string name="rc_emoji_loudspeaker">扩音器</string><!--121-->
+    <string name="rc_emoji_clock">表</string><!--122-->
+    <string name="rc_emoji_alarm_clock">闹钟</string><!--123-->
+    <string name="rc_emoji_hourglass">沙漏</string><!--124-->
+    <string name="rc_emoji_bomb">炸弹</string><!--125-->
+    <string name="rc_emoji_pistol">手枪</string><!--126-->
+    <string name="rc_emoji_capsule">药</string><!--127-->
+    <string name="rc_emoji_rocket">火箭</string><!--128-->
+    <string name="rc_emoji_globe">地球</string><!--129-->
+    <string name="rc_emoji_love_heart">爱心</string><!--130-->
+</resources>

+ 0 - 5
frame/imkit/src/main/res/values/ids.xml

@@ -1,5 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-    <item name="im_conversation_portrait_decor_container" type="id" />
-    <item name="im_conversation_identity_label_container" type="id" />
-</resources>

+ 135 - 0
frame/imkit/src/main/res/values/string.xml

@@ -0,0 +1,135 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <!--emoji description 128 total start-->
+    <string name="rc_emoji_smiley_face">Sliley Face</string>><!--1-->
+    <string name="rc_emoji_grinning_face">Grinning Face</string><!--2-->
+    <string name="rc_emoji_smiley">Smiley</string><!--3-->
+    <string name="rc_emoji_cute">Cute</string><!--4-->
+    <string name="rc_emoji_winking_face">Winking Face</string><!--5-->
+    <string name="rc_emoji_heart_eyes">Heart Eyes</string><!--6-->
+    <string name="rc_emoji_blowing_kiss">Blowing Kiss</string><!--7-->
+    <string name="rc_emoji_kiss_face">Kiss Face</string><!--8-->
+    <string name="rc_emoji_crazy_face">Crazy Face</string><!--9-->
+    <string name="rc_emoji_tongue_out">Tongue Out</string><!--10-->
+    <string name="rc_emoji_flushed_face">Flushed Face</string><!--11-->
+    <string name="rc_emoji_grinning_with_smiling">Grinning With Smiling</string><!--12-->
+    <string name="rc_emoji_pensive">Pensive</string><!--13-->
+    <string name="rc_emoji_pleased">Pleased</string><!--14-->
+    <string name="rc_emoji_dissatisfied">Dissatisfied</string><!--15-->
+    <string name="rc_emoji_worried_face">Worried Face</string><!--16-->
+    <string name="rc_emoji_disappointed_face">Disappointed Face</string><!--17-->
+    <string name="rc_emoji_helpless_face">Helpless Face</string><!--18-->
+    <string name="rc_emoji_crying">Crying</string><!--19-->
+    <string name="rc_emoji_laughing_tears">Laughing Tears</string><!--20-->
+    <string name="rc_emoji_sobbing">Sobbing</string><!--21-->
+    <string name="rc_emoji_sleepy_face">Sleepy Face</string><!--22-->
+    <string name="rc_emoji_cold_sweat">Cold Sweat</string><!--23-->
+    <string name="rc_emoji_happy_sweat">Happy Sweat</string><!--24-->
+    <string name="rc_emoji_sweat">Sweat</string><!--25-->
+    <string name="rc_emoji_tired_face">Tired Face</string><!--26-->
+    <string name="rc_emoji_weary_face">Weary Face</string><!--27-->
+    <string name="rc_emoji_fearful_face">Fearful Face</string><!--28-->
+    <string name="rc_emoji_scream">Scream</string><!--29-->
+    <string name="rc_emoji_angry_face">Angry Face</string><!--30-->
+    <string name="rc_emoji_mad_face">Mad Face</string><!--31-->
+    <string name="rc_emoji_confounded_face">Confounded Face</string><!--32-->
+    <string name="rc_emoji_big_grin">Big Grin</string><!--33-->
+    <string name="rc_emoji_hungry">Hungry</string><!--34-->
+    <string name="rc_emoji_mask_face">Mask Face</string><!--35-->
+    <string name="rc_emoji_sunglasses">Sunglassed</string><!--36-->
+    <string name="rc_emoji_sleeping">Sleeping</string><!--37-->
+    <string name="rc_emoji_shocked_face">Shocked Face</string><!--38-->
+    <string name="rc_emoji_dizzy_face">Dizzy Face</string><!--39-->
+    <string name="rc_emoji_purple_devil">Purple Devil</string><!--40-->
+    <string name="rc_emoji_devil">Devil</string><!--41-->
+    <string name="rc_emoji_surprised_face">Surprised Face</string><!--42-->
+    <string name="rc_emoji_grimacing_face">Grimacing Face</string><!--43-->
+    <string name="rc_emoji_confused">Confused</string><!--44-->
+    <string name="rc_emoji_mouthless">Mouthless</string><!--45-->
+    <string name="rc_emoji_halo">Halo</string><!--46-->
+    <string name="rc_emoji_smirking_face">Smirking Face</string><!--47-->
+    <string name="rc_emoji_expressionless_face">Expressionless Face</string><!--48-->
+    <string name="rc_emoji_see_no_monkey">See-No-Monkey</string><!--49-->
+    <string name="rc_emoji_hear_no_monkey">Hear-No-Monkey</string><!--50-->
+    <string name="rc_emoji_no_speaking">No Speaking</string><!--51-->
+    <string name="rc_emoji_alien">Alien</string><!--52-->
+    <string name="rc_emoji_pile_of_poo">Pile of Poo</string><!--53-->
+    <string name="rc_emoji_broken_heart">Broken Heart</string><!--54-->
+    <string name="rc_emoji_fire">Fire</string><!--55-->
+    <string name="rc_emoji_anger">Anger</string><!--56-->
+    <string name="rc_emoji_zzz">Zzz</string><!--57-->
+    <string name="rc_emoji_prohibited">Prohibited</string><!--58-->
+    <string name="rc_emoji_star">Star</string><!--59-->
+    <string name="rc_emoji_lightning_bolt">Lighting Bolt</string><!--60-->
+    <string name="rc_emoji_crescent_moon">Crescent Moon</string><!--61-->
+    <string name="rc_emoji_sunny">Sunny</string><!--62-->
+    <string name="rc_emoji_cloudy">Cloudy</string><!--63-->
+    <string name="rc_emoji_cloud">Cloud</string><!--64-->
+    <string name="rc_emoji_snowflake">Snowflake</string><!--65-->
+    <string name="rc_emoji_umbrella">Umbrella</string><!--66-->
+    <string name="rc_emoji_snowman">Snowman</string><!--67-->
+    <string name="rc_emoji_thumbs_up">Thumbs Up</string><!--68-->
+    <string name="rc_emoji_thumbs_down">Thumbs Down</string><!--69-->
+    <string name="rc_emoji_shake_hand">Shake Hand</string><!--70-->
+    <string name="rc_emoji_ok_hand">Ok Hand</string><!--71-->
+    <string name="rc_emoji_oncoming_fist">Oncoming Fist</string><!--72-->
+    <string name="rc_emoji_raised_fist">Raised Fist</string><!--73-->
+    <string name="rc_emoji_victory_hand">Victory Hand</string><!--74-->
+    <string name="rc_emoji_raised_hand">Raised Hand</string><!--75-->
+    <string name="rc_emoji_folded_hands">Folded Hands</string><!--76-->
+    <string name="rc_emoji_pointing_up">Pointing Up</string><!--77-->
+    <string name="rc_emoji_clapping_hands">Clapping Hands</string><!--78-->
+    <string name="rc_emoji_flexed_biceps">Flexed Biceps</string><!--79-->
+    <string name="rc_emoji_family">Family</string><!--80-->
+    <string name="rc_emoji_couple">Couple</string><!--81-->
+    <string name="rc_emoji_baby_angel">Baby Angel</string><!--82-->
+    <string name="rc_emoji_horse">Horse</string><!--83-->
+    <string name="rc_emoji_dog">Dog</string><!--84-->
+    <string name="rc_emoji_pig">Pig</string><!--85-->
+    <string name="rc_emoji_ghost">Ghost</string><!--86-->
+    <string name="rc_emoji_rose">Rose</string><!--87-->
+    <string name="rc_emoji_sunflower">Sunflower</string><!--88-->
+    <string name="rc_emoji_pine_tree">Pine Tree</string><!--89-->
+    <string name="rc_emoji_christmas_tree">Christmas Tree</string><!--90-->
+    <string name="rc_emoji_wrapped_gift">Wrapped Gift</string><!--91-->
+    <string name="rc_emoji_party_popper">Party Popper</string><!--92-->
+    <string name="rc_emoji_money_bag">Money Bag</string><!--93-->
+    <string name="rc_emoji_birthday_cake">Birthday Cake</string><!--94-->
+    <string name="rc_emoji_barbecue">Barbecue</string><!--95-->
+    <string name="rc_emoji_cooked_rice">Cooked Rice</string><!--96-->
+    <string name="rc_emoji_ice_cream">Ice Cream</string><!--97-->
+    <string name="rc_emoji_chocolate_bar">Chocolate Bar</string><!--98-->
+    <string name="rc_emoji_watermelon">Watermelon</string><!--99-->
+    <string name="rc_emoji_wine_glass">Wine Glass</string><!--100-->
+    <string name="rc_emoji_cheers">Cheers</string><!--101-->
+    <string name="rc_emoji_coffee">Coffee</string><!--102-->
+    <string name="rc_emoji_basketball">Basketball</string><!--103-->
+    <string name="rc_emoji_soccer_ball">Soccer Ball</string><!--104-->
+    <string name="rc_emoji_snowboarder">Snowboarder</string><!--105-->
+    <string name="rc_emoji_microphone">Microphone</string><!--106-->
+    <string name="rc_emoji_musical_note">Musical Note</string><!--107-->
+    <string name="rc_emoji_game_die">Game Die</string><!--108-->
+    <string name="rc_emoji_mahjone_red_dragon">Mahjong Red Dragon</string><!--109-->
+    <string name="rc_emoji_crown">Crown</string><!--110-->
+    <string name="rc_emoji_lipstick">Lipstick</string><!--111-->
+    <string name="rc_emoji_kiss">Kiss</string><!--112-->
+    <string name="rc_emoji_ring">Ring</string><!--113-->
+    <string name="rc_emoji_books">Books</string><!--114-->
+    <string name="rc_emoji_graduation_cap">Graduation Cap</string><!--115-->
+    <string name="rc_emoji_pencil">Pencil</string><!--116-->
+    <string name="rc_emoji_house_with_garden">House With Garden</string><!--117-->
+    <string name="rc_emoji_shower">Shower</string><!--118-->
+    <string name="rc_emoji_light_bulb">Light Bulb</string><!--119-->
+    <string name="rc_emoji_telephone_receiver">Telephone Receiver</string><!--120-->
+    <string name="rc_emoji_loudspeaker">Loudspeaker</string><!--121-->
+    <string name="rc_emoji_clock">Clock</string><!--122-->
+    <string name="rc_emoji_alarm_clock">Alarm Clock</string><!--123-->
+    <string name="rc_emoji_hourglass">Hourglass</string><!--124-->
+    <string name="rc_emoji_bomb">Bomb</string><!--125-->
+    <string name="rc_emoji_pistol">Pistol</string><!--126-->
+    <string name="rc_emoji_capsule">Capsule</string><!--127-->
+    <string name="rc_emoji_rocket">Rocket</string><!--128-->
+    <string name="rc_emoji_globe">Globe</string><!--129-->
+    <string name="rc_emoji_love_heart">Love</string><!--130-->
+    <!--emoji description 128 total end-->
+</resources>

+ 0 - 1
module/follow/src/main/java/com/adealink/weparty/follow/FriendHomeFragment.kt

@@ -24,7 +24,6 @@ class FriendHomeFragment : BaseFragment(R.layout.fragment_friend_home) {
         super.initViews()
         val pageAdapter = PageAdapter()
         binding.viewPager.adapter = pageAdapter
-        binding.viewPager.isUserInputEnabled = false
         TabLayoutMediator(
             binding.friendTabLayout, binding.viewPager
         ) { tab: Tab, position: Int ->

+ 1 - 0
module/message/src/main/AndroidManifest.xml

@@ -19,6 +19,7 @@
         <activity
             android:name=".conversation.ConversationActivity"
             android:screenOrientation="portrait"
+            android:launchMode="singleTop"
             android:theme="@style/AppTheme" />
         <activity
             android:name=".conversation.setting.ConversationSettingActivity"

+ 1 - 1
module/message/src/main/java/com/adealink/weparty/message/MessageFragment.kt

@@ -5,7 +5,7 @@ import android.os.Bundle
 import androidx.fragment.app.Fragment
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.fastLazy
-import com.adealink.frame.imkit.model.OFFICIAL_TARGET_ID
+import com.adealink.weparty.module.message.data.OFFICIAL_TARGET_ID
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
 import com.adealink.weparty.commonui.BaseFragment

+ 15 - 0
module/message/src/main/java/com/adealink/weparty/message/MessageServiceImpl.kt

@@ -4,6 +4,12 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.ViewModelStoreOwner
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.spi.RegisterService
+import com.adealink.weparty.commonui.widget.floatview.data.IBaseFloatData
+import com.adealink.weparty.commonui.widget.floatview.view.BaseFloatView
+import com.adealink.weparty.message.config.IMConfigCenter
+import com.adealink.weparty.message.floatview.NewMessageFloatData
+import com.adealink.weparty.message.floatview.NewMessageFloatView
+import com.adealink.weparty.message.manager.imConnectManager
 import com.adealink.weparty.message.manager.messageManager
 import com.adealink.weparty.message.viewmodel.MessageViewModel
 import com.adealink.weparty.message.viewmodel.MessageViewModelFactory
@@ -12,6 +18,11 @@ import com.adealink.weparty.module.message.viewmodel.IMessageViewModel
 
 @RegisterService(IMessageService::class)
 class MessageServiceImpl : IMessageService {
+    override fun init() {
+        IMConfigCenter.init()
+        imConnectManager.init()
+        messageManager.init()
+    }
 
     override fun getMessageViewModel(owner: ViewModelStoreOwner): IMessageViewModel {
         return ViewModelProvider(owner, MessageViewModelFactory())[MessageViewModel::class.java]
@@ -21,6 +32,10 @@ class MessageServiceImpl : IMessageService {
         return messageManager.batchGetFirstChatTs(uidSet)
     }
 
+    override fun getNewMessageFloatView(data: IBaseFloatData): BaseFloatView {
+        return NewMessageFloatView(data as NewMessageFloatData)
+    }
+
     override fun logout() {
 
     }

+ 2 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/config/BaseDataProcessor.kt → module/message/src/main/java/com/adealink/weparty/message/config/BaseDataProcessor.kt

@@ -1,5 +1,6 @@
-package com.adealink.frame.imkit.config
+package com.adealink.weparty.message.config
 
+import com.adealink.frame.imkit.config.DataProcessor
 import io.rong.imlib.model.Conversation
 
 /**

+ 21 - 17
frame/imkit/src/main/java/com/adealink/frame/imkit/config/ConversationConfig.kt → module/message/src/main/java/com/adealink/weparty/message/config/ConversationConfig.kt

@@ -1,29 +1,30 @@
-package com.adealink.frame.imkit.config
+package com.adealink.weparty.message.config
 
 import android.text.Spannable
 import android.text.SpannableString
-import com.adealink.frame.imkit.conversation.messagelist.provider.DefaultMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.HQVoiceMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.IConversationSummaryProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.IMessageProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.ImageMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.InformationNotificationMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.OfficialMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.RecallNotificationMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.RichContentMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.SightMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.TextMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.UnknownMessageItemProvider
-import com.adealink.frame.imkit.feature.refrence.ReferenceMessageItemProvider
-import com.adealink.frame.imkit.model.UiMessage
 import com.adealink.frame.imkit.widget.adapter.ProviderManager
+import com.adealink.weparty.message.conversation.extension.refrence.ReferenceMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.DefaultMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.HQVoiceMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.HistoryDivMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.IConversationSummaryProvider
+import com.adealink.weparty.message.conversation.provider.IMessageProvider
+import com.adealink.weparty.message.conversation.provider.ImageMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.InformationNotificationMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.OfficialMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.RecallNotificationMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.RichContentMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.SightMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.TargetInfoMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.TextMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.UnknownMessageItemProvider
+import com.adealink.weparty.message.data.UiMessage
 import io.rong.imlib.IRongCoreEnum.ConversationLoadMessageType
 import io.rong.imlib.model.Conversation
 import io.rong.imlib.model.MessageContent
 import java.util.concurrent.CopyOnWriteArrayList
 
 class ConversationConfig {
-
     // 新消息是否显示未读,目前支持 单,群聊
     private var showNewMessageBar = true
     // 历史消息是否显示,目前仅支持,单,群聊
@@ -56,7 +57,8 @@ class ConversationConfig {
     // 多端消息未读数同步,仅支持单群聊
     var enableMultiDeviceSync: Boolean = true
 
-    private val defaultMessageProvider = DefaultMessageItemProvider()
+    private val defaultMessageProvider =
+        DefaultMessageItemProvider()
     private var messageListProvider: ProviderManager<UiMessage> = ProviderManager()
     private val conversationSummaryProviders = CopyOnWriteArrayList<IConversationSummaryProvider<*>>()
     private val supportReadReceiptConversationTypes = HashSet<Conversation.ConversationType>(4)
@@ -76,7 +78,9 @@ class ConversationConfig {
         addMessageProvider(RecallNotificationMessageItemProvider())
         addMessageProvider(UnknownMessageItemProvider())
         addMessageProvider(InformationNotificationMessageItemProvider())
+        addMessageProvider(HistoryDivMessageItemProvider())
         addMessageProvider(OfficialMessageItemProvider())
+        addMessageProvider(TargetInfoMessageItemProvider())
         supportReadReceiptConversationTypes.add(Conversation.ConversationType.PRIVATE)
     }
 

+ 6 - 4
frame/imkit/src/main/java/com/adealink/frame/imkit/config/ConversationListConfig.kt → module/message/src/main/java/com/adealink/weparty/message/config/ConversationListConfig.kt

@@ -1,10 +1,11 @@
-package com.adealink.frame.imkit.config
+package com.adealink.weparty.message.config
 
-import com.adealink.frame.imkit.conversationlist.model.BaseUiConversation
-import com.adealink.frame.imkit.conversationlist.provider.BaseConversationProvider
-import com.adealink.frame.imkit.conversationlist.provider.PrivateConversationProvider
+import com.adealink.frame.imkit.config.DataProcessor
 import com.adealink.frame.imkit.widget.adapter.IViewProvider
 import com.adealink.frame.imkit.widget.adapter.ProviderManager
+import com.adealink.weparty.message.conversationlist.model.BaseUiConversation
+import com.adealink.weparty.message.conversationlist.provider.BaseConversationProvider
+import com.adealink.weparty.message.conversationlist.provider.PrivateConversationProvider
 import io.rong.imlib.model.Conversation
 
 class ConversationListConfig {
@@ -24,6 +25,7 @@ class ConversationListConfig {
         providerList.add(PrivateConversationProvider())
         providerManager = ProviderManager(providerList)
         providerManager.setDefaultProvider(BaseConversationProvider())
+        addConversationProvider(PrivateConversationProvider())
     }
 
     fun getProviderManager(): ProviderManager<BaseUiConversation> {

+ 1 - 3
frame/imkit/src/main/java/com/adealink/frame/imkit/config/DefaultConversationListProcessor.kt → module/message/src/main/java/com/adealink/weparty/message/config/DefaultConversationListProcessor.kt

@@ -1,8 +1,6 @@
-package com.adealink.frame.imkit.config
+package com.adealink.weparty.message.config
 
 import android.text.TextUtils
-import com.adealink.frame.imkit.model.isOfficialTarget
-import com.adealink.frame.imkit.model.isSystemTarget
 import io.rong.imlib.model.Conversation
 import java.util.LinkedList
 

+ 18 - 0
module/message/src/main/java/com/adealink/weparty/message/config/IMConfigCenter.kt

@@ -0,0 +1,18 @@
+package com.adealink.weparty.message.config
+
+import com.adealink.frame.imkit.IMService
+import com.adealink.weparty.message.conversation.data.OfficialMessage
+import io.rong.message.SightMessage
+
+object IMConfigCenter {
+    var conversationListConfig: ConversationListConfig = ConversationListConfig()
+    var conversationConfig: ConversationConfig = ConversationConfig()
+
+    fun init() {
+        registerMessageType()
+    }
+
+    private fun registerMessageType() {
+        IMService.innerService.registerMessageType(listOf(SightMessage::class.java, OfficialMessage::class.java))
+    }
+}

+ 8 - 4
module/message/src/main/java/com/adealink/weparty/message/constant/Tags.kt

@@ -1,13 +1,17 @@
 package com.adealink.weparty.message.constant
 
+import com.adealink.frame.imkit.model.TAG_IM
+
 /**
  * Created by sunxiaodong on 2021/7/9.
  */
 const val TAG_MESSAGE = "tag_message"
-const val TAG_MESSAGE_LIST = "${TAG_MESSAGE}_list"
-const val TAG_MESSAGE_DETAIL = "${TAG_MESSAGE}_detail"
-const val TAG_MESSAGE_COMPETITIVE_WORD = "${TAG_MESSAGE}_competitive_word"
-const val TAG_MESSAGE_FAMILY_SETTING = "${TAG_MESSAGE}_family_setting"
+
+const val TAG_IM_REFERENCE = "${TAG_IM}_reference"
+const val TAG_IM_MSG_PROVIDER = "${TAG_IM}_msg_provider"
+const val TAG_IM_CONV_LIST_VM = "${TAG_IM}_conv_list_vm"
+const val TAG_IM_CONV_VM = "${TAG_IM}_conv_vm"
+const val TAG_IM_PROCESSOR = "${TAG_IM}_processor"
 
 const val TAG_CONVERSATION = "tag_conversation"
 const val TAG_CONVERSATION_FRG = "${TAG_CONVERSATION}_frg"

+ 32 - 2
module/message/src/main/java/com/adealink/weparty/message/conversation/ConversationActivity.kt

@@ -1,9 +1,10 @@
 package com.adealink.weparty.message.conversation
 
+import android.content.Intent
 import android.os.Bundle
 import androidx.constraintlayout.widget.ConstraintLayout
 import androidx.core.view.updateLayoutParams
-import com.adealink.frame.imkit.utils.IMRouteUtils
+import com.adealink.weparty.message.util.IMRouteUtils
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
 import com.adealink.frame.router.annotation.BindExtra
@@ -37,6 +38,31 @@ class ConversationActivity: BaseActivity() {
     override fun onBeforeCreate() {
         super.onBeforeCreate()
         Router.bind(this)
+        activeTargetId = toUid
+    }
+
+    override fun onResume() {
+        super.onResume()
+        activeTargetId = toUid
+    }
+
+    override fun onNewIntent(intent: Intent) {
+        super.onNewIntent(intent)
+        Router.bind(this)
+        val fragment = supportFragmentManager.findFragmentByTag(Message.Conversation.FRAGMENT_TAG) as? ConversationFragment
+        fragment?.onNewIntent(intent)
+    }
+
+    override fun onStop() {
+        super.onStop()
+        if (isFinishing) {
+            activeTargetId = null
+        }
+    }
+
+    override fun onDestroy() {
+        super.onDestroy()
+        activeTargetId = null
     }
 
     override fun initViews() {
@@ -59,7 +85,11 @@ class ConversationActivity: BaseActivity() {
             }
         } ?: return
         supportFragmentManager.beginTransaction()
-            .add(R.id.f_container, conversationFragment)
+            .add(R.id.f_container, conversationFragment, Message.Conversation.FRAGMENT_TAG)
             .commit()
     }
+
+    companion object {
+        var activeTargetId: Long? = null
+    }
 }

+ 74 - 92
module/message/src/main/java/com/adealink/weparty/message/conversation/ConversationFragment.kt

@@ -1,6 +1,7 @@
 package com.adealink.weparty.message.conversation
 
 import android.annotation.SuppressLint
+import android.content.Intent
 import android.os.Bundle
 import android.text.TextUtils
 import android.view.GestureDetector
@@ -17,33 +18,23 @@ import androidx.recyclerview.widget.RecyclerView
 import com.adealink.frame.aab.util.getCompatColor
 import com.adealink.frame.base.AppBaseInfo
 import com.adealink.frame.base.fastLazy
-import com.adealink.frame.ext.isViewBindingValid
-import com.adealink.frame.imkit.MessageItemLongClickAction
-import com.adealink.frame.imkit.config.IMConfigCenter
-import com.adealink.frame.imkit.conversation.MessageListAdapter
-import com.adealink.frame.imkit.conversation.extension.ExtensionViewModel
-import com.adealink.frame.imkit.conversation.messagelist.provider.MessageClickType
-import com.adealink.frame.imkit.conversation.messagelist.status.MessageProcessor
-import com.adealink.frame.imkit.conversation.viewmodel.MessageItemLongClickBean
-import com.adealink.frame.imkit.event.Event
-import com.adealink.frame.imkit.event.uievent.PageDestroyEvent
-import com.adealink.frame.imkit.event.uievent.PageEvent
-import com.adealink.frame.imkit.event.uievent.ScrollEvent
-import com.adealink.frame.imkit.event.uievent.ScrollToEndEvent
-import com.adealink.frame.imkit.event.uievent.ShowLoadMessageDialogEvent
-import com.adealink.frame.imkit.event.uievent.ShowLongClickDialogEvent
-import com.adealink.frame.imkit.event.uievent.ShowWarningDialogEvent
-import com.adealink.frame.imkit.event.uievent.SmoothScrollEvent
-import com.adealink.frame.imkit.event.uievent.ToastEvent
-import com.adealink.frame.imkit.model.UiMessage
-import com.adealink.frame.imkit.model.isSystemTarget
-import com.adealink.frame.imkit.utils.IMRouteUtils
+import com.adealink.weparty.message.event.Event
+import com.adealink.weparty.message.event.uievent.PageDestroyEvent
+import com.adealink.weparty.message.event.uievent.PageEvent
+import com.adealink.weparty.message.event.uievent.ScrollEvent
+import com.adealink.weparty.message.event.uievent.ScrollToEndEvent
+import com.adealink.weparty.message.event.uievent.ShowLoadMessageDialogEvent
+import com.adealink.weparty.message.event.uievent.ShowLongClickDialogEvent
+import com.adealink.weparty.message.event.uievent.ShowWarningDialogEvent
+import com.adealink.weparty.message.event.uievent.SmoothScrollEvent
+import com.adealink.weparty.message.event.uievent.ToastEvent
+import com.adealink.weparty.message.util.IMRouteUtils
 import com.adealink.frame.imkit.widget.FixedLinearLayoutManager
 import com.adealink.frame.imkit.widget.adapter.BaseAdapter
 import com.adealink.frame.imkit.widget.adapter.IViewProviderListener
 import com.adealink.frame.imkit.widget.adapter.ViewHolder
-import com.adealink.frame.imkit.widget.refresh.IMRefreshHeader
 import com.adealink.frame.log.Log
+import com.adealink.frame.mvvm.view.ViewComponent
 import com.adealink.frame.mvvm.view.viewBinding
 import com.adealink.frame.router.Router
 import com.adealink.frame.router.annotation.BindExtra
@@ -52,23 +43,27 @@ import com.adealink.frame.util.AppUtil
 import com.adealink.weparty.commonui.BaseFragment
 import com.adealink.weparty.commonui.ext.dp
 import com.adealink.weparty.commonui.ext.gone
-import com.adealink.weparty.commonui.ext.onFailure
-import com.adealink.weparty.commonui.ext.onSuccess
 import com.adealink.weparty.commonui.ext.show
 import com.adealink.weparty.commonui.toast.util.showToast
 import com.adealink.weparty.commonui.widget.CommonDialog
 import com.adealink.weparty.message.R
+import com.adealink.weparty.message.config.IMConfigCenter
 import com.adealink.weparty.message.constant.TAG_CONVERSATION_FRG
 import com.adealink.weparty.message.conversation.comp.ConversationTargetInfoComp
-import com.adealink.weparty.message.conversation.data.ConversationTargetInfo
+import com.adealink.weparty.message.conversation.extension.ExtensionViewModel
 import com.adealink.weparty.message.conversation.extension.inputpanel.ConversationInputPanelFragment
-import com.adealink.weparty.message.conversation.listener.IConversationProviderCallback
+import com.adealink.weparty.message.conversation.extension.longclick.MessageItemLongClickAction
 import com.adealink.weparty.message.conversation.message.TargetInfoMessage
-import com.adealink.weparty.message.conversation.provider.TargetInfoProvider
+import com.adealink.weparty.message.conversation.provider.MessageClickType
+import com.adealink.weparty.message.conversation.status.MessageProcessor
+import com.adealink.weparty.message.conversation.extension.longclick.MessageItemLongClickBean
 import com.adealink.weparty.message.conversation.viewmodel.WeConversationViewModel
+import com.adealink.weparty.message.data.UiMessage
+import com.adealink.weparty.module.message.data.isSystemTarget
 import com.adealink.weparty.message.databinding.FragmentConversationBinding
 import com.adealink.weparty.message.databinding.LayoutMessageOptionPopupBinding
 import com.adealink.weparty.message.databinding.LayoutMessagePopupItemBinding
+import com.adealink.weparty.message.widget.refresh.IMRefreshHeader
 import com.adealink.weparty.module.account.AccountModule
 import com.adealink.weparty.module.anchor.data.FromScene
 import com.adealink.weparty.module.message.Message
@@ -84,16 +79,13 @@ import io.rong.imlib.model.Conversation.ConversationType
 import io.rong.imlib.model.ConversationIdentifier
 import java.text.MessageFormat
 import kotlin.math.max
-import com.adealink.frame.imkit.R as IM_KIT_R
 import io.rong.imlib.model.Message as RMessage
 
 @RouterUri(path = [Message.Conversation.FRAGMENT], desc = "会话详情页Fragment")
 class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
     IViewProviderListener<UiMessage>,
     OnRefreshListener,
-    View.OnClickListener,
-    OnLoadMoreListener,
-    IConversationProviderCallback {
+    OnLoadMoreListener {
 
     @BindExtra(name = Message.Common.EXTRA_TO_UID, desc = "聊天对方的uid", must = true)
     var toUid: Long = 0
@@ -121,13 +113,11 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
     private var conversationIdentifier: ConversationIdentifier? = null
     private var bindToConversation = false
     private var bundle: Bundle? = null
+    private val fragmentList = arrayListOf<BaseFragment>()
+    private val compList = arrayListOf<ViewComponent>()
 
     // 是否滑动结束
     private var onScrollStopRefreshList: Boolean = false
-
-    private val customMessageProviderList by fastLazy {
-        listOf(TargetInfoProvider(this))
-    }
     private var topInfoComp: ConversationTargetInfoComp? = null
 
     private var pageObserver = Observer<PageEvent> { event ->
@@ -224,10 +214,10 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
                 .isShowNewMessageBar(conversationViewModel.curConversationType)
         ) {
             if (count > 0) {
-                binding.rcNewMessageNumber.visibility = View.VISIBLE
-                binding.rcNewMessageNumber.text = if (count > 99) "99+" else count.toString()
+                binding.newMessageNumber.visibility = View.VISIBLE
+                binding.newMessageNumber.text = if (count > 99) "99+" else count.toString()
             } else {
-                binding.rcNewMessageNumber.visibility = View.INVISIBLE
+                binding.newMessageNumber.visibility = View.INVISIBLE
             }
         }
     }
@@ -237,13 +227,13 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
                 .isShowHistoryMessageBar(conversationViewModel.curConversationType)
         ) {
             if (count > 0) {
-                binding.rcUnreadMessageCount.visibility = View.VISIBLE
-                binding.rcUnreadMessageCount.text = MessageFormat.format(
-                    getString(IM_KIT_R.string.rc_unread_message),
+                binding.unreadMessageCount.visibility = View.VISIBLE
+                binding.unreadMessageCount.text = MessageFormat.format(
+                    getString(R.string.rc_unread_message),
                     if (count > 99) "99+" else count
                 )
             } else {
-                binding.rcUnreadMessageCount.visibility = View.GONE
+                binding.unreadMessageCount.visibility = View.GONE
             }
         }
     }
@@ -288,6 +278,27 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
         }
     }
 
+    override fun onNewIntent(intent: Intent?) {
+        val newArguments = Bundle().apply {
+            intent?.extras?.let { putAll(it) }
+        }
+        arguments = newArguments
+        Router.bind(this)
+        conversationIdentifier = ConversationIdentifier.obtain(
+            ConversationType.setValue(conversationType),
+            toUid.toString(),
+            ""
+        )
+        bundle = intent?.extras
+        loadData()
+        fragmentList.forEach {
+            it.onNewIntent(intent)
+        }
+        compList.forEach {
+            it.onNewIntent(intent)
+        }
+    }
+
     @SuppressLint("ClickableViewAccessibility")
     override fun initViews() {
         super.initViews()
@@ -375,13 +386,21 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
         binding.refreshLayout.setEnableRefresh(true)
         binding.refreshLayout.setOnRefreshListener(this)
         binding.refreshLayout.setOnLoadMoreListener(this)
+        binding.newMessageNumber.setOnClickListener {
+            conversationViewModel.newMessageBarClick()
+        }
+        binding.unreadMessageCount.setOnClickListener {
+            conversationViewModel.unreadBarClick()
+        }
     }
 
     override fun initComponents() {
         super.initComponents()
-        topInfoComp = ConversationTargetInfoComp(this, toUid, binding.topBarCenterLayout).apply {
+        val topInfoComp = ConversationTargetInfoComp(this, toUid, binding.topBarCenterLayout).apply {
             attach()
         }
+        compList.add(topInfoComp)
+        this.topInfoComp = topInfoComp
     }
 
     override fun observeViewModel() {
@@ -406,12 +425,14 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
         }
         bindConversation(conversationIdentifier, bundle)
         if (!isSystemTarget(toUid)) {
-            childFragmentManager.beginTransaction()
-                .add(
-                    R.id.input_panel_container,
-                    ConversationInputPanelFragment.newInstance(conversationIdentifier)
-                )
-                .commit()
+            var inputPanelFragment = childFragmentManager.findFragmentById(R.id.input_panel_container)
+            if (inputPanelFragment == null) {
+                inputPanelFragment = ConversationInputPanelFragment.newInstance(conversationIdentifier)
+                fragmentList.add(inputPanelFragment)
+                childFragmentManager.beginTransaction()
+                    .add(R.id.input_panel_container, inputPanelFragment)
+                    .commit()
+            }
         }
     }
 
@@ -467,11 +488,7 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
     }
 
     private fun onResolveAdapter(): MessageListAdapter {
-        val providerManager = IMConfigCenter.conversationConfig.getMessageListProvider().copy()
-        customMessageProviderList.forEach { provider ->
-            providerManager.addProvider(provider)
-        }
-        return MessageListAdapter(this@ConversationFragment, providerManager)
+        return MessageListAdapter(this@ConversationFragment)
     }
 
     private fun createLayoutManager(): RecyclerView.LayoutManager {
@@ -486,7 +503,7 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
         when (clickType) {
             MessageClickType.USER_PORTRAIT_CLICK -> {
                 val act = activity ?: return
-                val uid = data.getUserInfo().id.toLongOrNull()
+                val uid = data.getUserInfo().id
                 Router.build(act, Profile.UserProfile.PATH).putExtra(
                     Profile.Common.EXTRA_UID, uid
                 ).start()
@@ -507,15 +524,6 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
         }
     }
 
-    override fun onClick(v: View) {
-        val id = v.id
-        if (id == R.id.rc_new_message_number) {
-            conversationViewModel.newMessageBarClick()
-        } else if (id == R.id.rc_unread_message_count) {
-            conversationViewModel.unreadBarClick()
-        }
-    }
-
     override fun onLoadMore(refreshLayout: RefreshLayout) {
         conversationViewModel.onLoadMore()
     }
@@ -556,7 +564,7 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
         adapter
         val view =
             binding.messageList.findViewHolderForLayoutPosition(pos)?.itemView?.findViewById<FrameLayout>(
-                IM_KIT_R.id.im_content
+                R.id.im_content
             )
         if (view == null) {
             return
@@ -608,7 +616,7 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
         callback: MessageProcessor.GetMessageCallback?, list: List<io.rong.imlib.model.Message>
     ) {
         CommonDialog.Builder()
-            .message(getString(IM_KIT_R.string.rc_load_local_message))
+            .message(getString(R.string.rc_load_local_message))
             .onPositive {
                 callback?.onSuccess(list, true)
             }
@@ -616,30 +624,4 @@ class ConversationFragment : BaseFragment(R.layout.fragment_conversation),
                 callback?.onErrorAsk(list)
             }.show(childFragmentManager)
     }
-
-    override fun getTargetInfo(targetId: Long, callback: (ConversationTargetInfo?) -> Unit) {
-        if (!isViewBindingValid()) {
-            callback(null)
-            return
-        }
-        if (targetId == 0L) {
-            callback(null)
-            return
-        }
-        profileViewModel?.getUidUserInfo(targetId)?.observe(viewLifecycleOwner) {
-            it.onSuccess { userInfo ->
-                callback(ConversationTargetInfo(userInfo))
-            }
-            it.onFailure {
-                callback(null)
-            }
-        }
-    }
-
-    override fun goTargetProfile(targetId: Long) {
-        val act = activity ?: return
-        Router.build(act, Profile.UserProfile.PATH)
-            .putExtra(Profile.Common.EXTRA_UID, targetId)
-            .start()
-    }
 }

+ 5 - 5
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/MessageListAdapter.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/MessageListAdapter.kt

@@ -1,14 +1,14 @@
-package com.adealink.frame.imkit.conversation
+package com.adealink.weparty.message.conversation
 
 import androidx.recyclerview.widget.DiffUtil
 import androidx.recyclerview.widget.ListUpdateCallback
-import com.adealink.frame.imkit.model.UiMessage
+import com.adealink.weparty.message.data.UiMessage
 import com.adealink.frame.imkit.widget.adapter.BaseAdapter
 import com.adealink.frame.imkit.widget.adapter.IViewProviderListener
-import com.adealink.frame.imkit.widget.adapter.ProviderManager
+import com.adealink.weparty.message.config.IMConfigCenter
 
-class MessageListAdapter(listener: IViewProviderListener<UiMessage>, providerManger: ProviderManager<UiMessage>) :
-    BaseAdapter<UiMessage>(listener, providerManger) {
+class MessageListAdapter(listener: IViewProviderListener<UiMessage>) :
+    BaseAdapter<UiMessage>(listener, IMConfigCenter.conversationConfig.getMessageListProvider()) {
 
     override fun setDataCollection(data: List<UiMessage>?) {
         var data = data

+ 8 - 2
module/message/src/main/java/com/adealink/weparty/message/conversation/comp/ConversationTargetInfoComp.kt

@@ -1,9 +1,10 @@
 package com.adealink.weparty.message.conversation.comp
 
+import android.content.Intent
 import androidx.lifecycle.LifecycleOwner
 import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.fastLazy
-import com.adealink.frame.imkit.model.OFFICIAL_TARGET_ID
+import com.adealink.weparty.module.message.data.OFFICIAL_TARGET_ID
 import com.adealink.frame.mvvm.view.ViewComponent
 import com.adealink.frame.router.Router
 import com.adealink.weparty.commonui.ext.gone
@@ -38,7 +39,7 @@ class ConversationTargetInfoComp(
                 }
             }
         }
-        profileViewModel?.getUsersOnlineInRoomStatus(listOf(targetId))?.observe(viewLifecycleOwner) { uid2Status ->
+        profileViewModel?.getUsersOnlineInRoomStatus(setOf(targetId))?.observe(viewLifecycleOwner) { uid2Status ->
             val status = uid2Status[targetId]
             if (status == null) {
                 binding.onlineTv.gone()
@@ -68,4 +69,9 @@ class ConversationTargetInfoComp(
             }
         }
     }
+
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+        loadData()
+    }
 }

+ 16 - 4
module/message/src/main/java/com/adealink/weparty/message/conversation/data/ConversationData.kt

@@ -1,12 +1,24 @@
 package com.adealink.weparty.message.conversation.data
 
 import com.adealink.weparty.module.profile.data.UserInfo
+import com.google.gson.annotations.GsonNullable
+import com.google.gson.annotations.SerializedName
 
 data class ConversationTargetInfo(
     val userInfo: UserInfo? = null,
 )
 
-enum class QuickMediaSelectError {
-    ExceedMaxSize,
-    ExceedMaxDuration,
-}
+data class MessageBlockRlt(
+    @GsonNullable
+    @SerializedName("result")
+    val result: MessageBlockRes?,
+)
+
+data class MessageBlockRes(
+    @SerializedName("code")
+    val code: Int? = 0,
+    @SerializedName("message")
+    val message: String? = "",
+    @SerializedName("sucessed")
+    val success: Boolean? = false
+)

+ 5 - 4
frame/imkit/src/main/java/com/adealink/frame/imkit/model/MessageExpansion.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/data/MessageExpansion.kt

@@ -1,6 +1,7 @@
-package com.adealink.frame.imkit.model
+package com.adealink.weparty.message.conversation.data
 
-import com.adealink.frame.imkit.R
+import com.adealink.weparty.message.R
+import com.adealink.weparty.module.wallet.data.Currency
 import com.google.gson.annotations.SerializedName
 
 enum class MessageExpansionKey(val key: String) {
@@ -22,14 +23,14 @@ data class MessagePriceInfo(
 ) {
     fun getCostIconRes(): Int {
         return when (currencyType) {
-            0 -> R.drawable.im_price_diamond_icon
+            Currency.Coin.value.toInt() -> R.drawable.im_price_diamond_icon
             else -> 0
         }
     }
 
     fun getIncomeIconRes(): Int {
         return when (currencyType) {
-            1 -> R.drawable.im_price_diamond_icon
+            Currency.Diamond.value.toInt() -> R.drawable.im_price_diamond_icon
             else -> 0
         }
     }

+ 4 - 4
frame/imkit/src/main/java/com/adealink/frame/imkit/model/OfficialMessage.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/data/OfficialMessage.kt

@@ -1,9 +1,9 @@
-package com.adealink.frame.imkit.model
+package com.adealink.weparty.message.conversation.data
 
 import android.os.Parcel
 import android.os.Parcelable
 import com.adealink.frame.data.json.froJsonErrorNull
-import com.adealink.frame.imkit.IMService
+import com.adealink.weparty.App
 import io.rong.common.ParcelUtils
 import io.rong.imlib.MessageTag
 import io.rong.imlib.model.MessageContent
@@ -97,12 +97,12 @@ class OfficialMessage : MessageContent {
     }
 
     fun getCurLanguageBannerUrl(): String? {
-        val languageCode = IMService.innerService.config.getAppLanguageCode()
+        val languageCode = App.instance.languageManager.getLanguageCode()
         return lang2OfficialMessageMap?.getOrDefault(languageCode, officialMessage)?.bannerUrl
     }
 
     fun getCurLanguageContent(): String? {
-        val languageCode = IMService.innerService.config.getAppLanguageCode()
+        val languageCode = App.instance.languageManager.getLanguageCode()
         return lang2OfficialMessageMap?.getOrDefault(languageCode, officialMessage)?.content
     }
 

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/model/OfficialMessageRealContent.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/data/OfficialMessageRealContent.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.model
+package com.adealink.weparty.message.conversation.data
 
 import android.os.Parcelable
 import com.google.gson.annotations.SerializedName

+ 1 - 5
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/ExtensionViewModel.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/ExtensionViewModel.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension
+package com.adealink.weparty.message.conversation.extension
 
 import android.annotation.SuppressLint
 import android.content.Context
@@ -8,11 +8,9 @@ import com.adealink.frame.mvvm.livedata.ExtLiveData
 import com.adealink.frame.mvvm.livedata.ExtMutableLiveData
 import com.adealink.frame.mvvm.viewmodel.BaseViewModel
 import com.adealink.frame.util.AppUtil
-import io.rong.common.rlog.RLog
 
 @SuppressLint("StaticFieldLeak")
 class ExtensionViewModel: BaseViewModel(), IExtensionViewModel {
-    private val TAG: String = this.javaClass.simpleName
     override val inputModeLD: ExtLiveData<InputMode> = ExtMutableLiveData()
     override val extensionBoardOpenLD: ExtLiveData<Boolean> = ExtMutableLiveData()
     private var isSoftInputShow = false
@@ -52,10 +50,8 @@ class ExtensionViewModel: BaseViewModel(), IExtensionViewModel {
 
     override fun collapseExtensionBoard() {
         if (extensionBoardOpenLD.getValue() != null && extensionBoardOpenLD.getValue() == false) {
-            RLog.d(TAG, "already collapsed, return directly.")
             return
         }
-        RLog.d(TAG, "collapseExtensionBoard")
         setSoftInputKeyBoard(false)
         extensionBoardOpenLD.send(false)
     }

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/IExtensionBoard.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/IExtensionBoard.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension
+package com.adealink.weparty.message.conversation.extension
 
 import android.view.View
 

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/IExtensionViewModel.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/IExtensionViewModel.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension
+package com.adealink.weparty.message.conversation.extension
 
 import android.widget.EditText
 import com.adealink.frame.mvvm.livedata.ExtLiveData

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/InputMode.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/InputMode.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension
+package com.adealink.weparty.message.conversation.extension
 
 enum class InputMode {
     /*文本输入状态*/

+ 3 - 3
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/emotion/AndroidEmoji.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/AndroidEmoji.kt

@@ -1,9 +1,9 @@
-package com.adealink.frame.imkit.conversation.extension.emotion
+package com.adealink.weparty.message.conversation.extension.emotion
 
 import android.content.Context
 import android.graphics.drawable.Drawable
 import com.adealink.frame.aab.util.getCompatDrawable
-import io.rong.common.rlog.RLog
+import com.adealink.frame.log.Log
 
 object AndroidEmoji {
     private const val TAG = "AndroidEmoji"
@@ -85,7 +85,7 @@ object AndroidEmoji {
             val info = sEmojiList[index]
             return info.code
         }
-        RLog.e(TAG, "getEmojiCode sEmojiList IndexOutOfBounds")
+        Log.e(TAG, "getEmojiCode sEmojiList IndexOutOfBounds")
         return 0
     }
 

+ 5 - 5
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/emotion/EmojiTab.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/EmojiTab.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension.emotion
+package com.adealink.weparty.message.conversation.extension.emotion
 
 import android.content.Context
 import android.graphics.drawable.Drawable
@@ -16,10 +16,10 @@ import androidx.recyclerview.widget.RecyclerView
 import androidx.viewpager2.widget.ViewPager2
 import androidx.viewpager2.widget.ViewPager2.OnPageChangeCallback
 import com.adealink.frame.aab.util.getCompatDrawable
-import com.adealink.frame.imkit.R
-import com.adealink.frame.imkit.conversation.extension.emotion.AndroidEmoji.emojiSize
-import com.adealink.frame.imkit.conversation.extension.emotion.AndroidEmoji.getEmojiCode
-import com.adealink.frame.imkit.conversation.extension.emotion.AndroidEmoji.getEmojiDrawable
+import com.adealink.weparty.message.R
+import com.adealink.weparty.message.conversation.extension.emotion.AndroidEmoji.emojiSize
+import com.adealink.weparty.message.conversation.extension.emotion.AndroidEmoji.getEmojiCode
+import com.adealink.weparty.message.conversation.extension.emotion.AndroidEmoji.getEmojiDrawable
 import com.adealink.frame.util.AppUtil
 import kotlin.math.min
 

+ 5 - 9
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/emotion/EmoticonBoard.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/EmoticonBoard.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension.emotion
+package com.adealink.weparty.message.conversation.extension.emotion
 
 import android.content.Context
 import android.graphics.Color
@@ -17,10 +17,9 @@ import androidx.lifecycle.ViewModelProvider
 import androidx.viewpager.widget.PagerAdapter
 import androidx.viewpager.widget.ViewPager
 import com.adealink.frame.aab.util.getCompatColor
-import com.adealink.frame.imkit.R
-import com.adealink.frame.imkit.config.IMConfigCenter.extensionConfig
-import com.adealink.frame.imkit.conversation.extension.ExtensionViewModel
-import com.adealink.frame.imkit.conversation.extension.IExtensionBoard
+import com.adealink.weparty.message.R
+import com.adealink.weparty.message.conversation.extension.ExtensionViewModel
+import com.adealink.weparty.message.conversation.extension.IExtensionBoard
 import com.adealink.frame.util.DisplayUtil.dp2px
 import com.adealink.frame.util.DisplayUtil.getScreenWidth
 
@@ -133,10 +132,7 @@ class EmoticonBoard(
             scrollTab.removeAllViews()
         }
         emotionTabs.clear()
-        emotionTabs.putAll(
-            extensionConfig
-                .getEmoticonTabs()
-        )
+        emotionTabs["default"] = mutableListOf(EmojiTab())
         for (tab in allTabs) {
             val ctx = fragment.context
             if (ctx != null) {

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/emotion/IEmojiItemClickListener.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmojiItemClickListener.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension.emotion
+package com.adealink.weparty.message.conversation.extension.emotion
 
 interface IEmojiItemClickListener {
     /**

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/emotion/IEmoticonClickListener.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmoticonClickListener.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension.emotion
+package com.adealink.weparty.message.conversation.extension.emotion
 
 import android.view.View
 

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/emotion/IEmoticonSettingClickListener.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmoticonSettingClickListener.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension.emotion
+package com.adealink.weparty.message.conversation.extension.emotion
 
 import android.view.View
 

+ 1 - 1
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/extension/emotion/IEmoticonTab.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/emotion/IEmoticonTab.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.conversation.extension.emotion
+package com.adealink.weparty.message.conversation.extension.emotion
 
 import android.content.Context
 import android.graphics.drawable.Drawable

+ 1 - 7
module/message/src/main/java/com/adealink/weparty/message/conversation/extension/gallery/GalleryBoardComp.kt

@@ -7,7 +7,7 @@ import android.view.View
 import androidx.lifecycle.LifecycleOwner
 import androidx.recyclerview.widget.LinearLayoutManager
 import com.adealink.frame.base.fastLazy
-import com.adealink.frame.imkit.conversation.extension.IExtensionBoard
+import com.adealink.weparty.message.conversation.extension.IExtensionBoard
 import com.adealink.frame.log.Log
 import com.adealink.frame.mvvm.view.ViewComponent
 import com.adealink.frame.mvvm.viewmodel.activityViewModels
@@ -24,7 +24,6 @@ import com.adealink.weparty.imageselect.takePhoto.TakePhotoLifecycleObserver
 import com.adealink.weparty.imageselect.util.PictureMimeType
 import com.adealink.weparty.imageselect.viewmodel.MediaSelectViewModel
 import com.adealink.weparty.message.constant.TAG_CONVERSATION_INPUT_PANEL
-import com.adealink.weparty.message.conversation.data.QuickMediaSelectError
 import com.adealink.weparty.message.conversation.extension.gallery.select.IQuickImageSelectListener
 import com.adealink.weparty.message.conversation.extension.gallery.select.QuickImageViewBinder
 import com.adealink.weparty.message.databinding.LayoutGalleryBoardBinding
@@ -33,7 +32,6 @@ import com.adealink.weparty.permission.PermissionUtils
 import com.adealink.weparty.storage.file.FilePath.takePhotoImagePath
 import com.adealink.weparty.util.goImagePreviewActivity
 import com.adealink.weparty.util.goVideoPreviewActivity
-import io.rong.message.ImageMessage
 import java.io.File
 
 class GalleryBoardComp(
@@ -196,10 +194,6 @@ class GalleryBoardComp(
         }
     }
 
-    override fun onMediaSelectError(error: QuickMediaSelectError) {
-
-    }
-
     override fun onItemChecked(position: Int) {
         val item = selectImageListAdapter.items[position]
         if (item is LocalMedia) {

+ 0 - 5
module/message/src/main/java/com/adealink/weparty/message/conversation/extension/gallery/select/IQuickImageSelectListener.kt

@@ -1,13 +1,8 @@
 package com.adealink.weparty.message.conversation.extension.gallery.select
 
 import com.adealink.weparty.imageselect.model.LocalMedia
-import com.adealink.weparty.message.conversation.data.QuickMediaSelectError
 
 interface IQuickImageSelectListener {
-    /**
-     * 媒体图片选择错误回调
-     */
-    fun onMediaSelectError(error: QuickMediaSelectError)
 
     fun onItemChecked(position: Int)
 

+ 13 - 9
module/message/src/main/java/com/adealink/weparty/message/conversation/extension/inputpanel/ConversationInputPanelFragment.kt

@@ -2,6 +2,7 @@ package com.adealink.weparty.message.conversation.extension.inputpanel
 
 import android.Manifest
 import android.annotation.SuppressLint
+import android.content.Intent
 import android.os.Build
 import android.os.Bundle
 import android.text.Editable
@@ -20,12 +21,12 @@ import com.adealink.frame.aab.util.getCompatString
 import com.adealink.frame.base.Rlt
 import com.adealink.frame.base.fastLazy
 import com.adealink.frame.ext.isViewBindingValid
-import com.adealink.frame.imkit.conversation.extension.ExtensionViewModel
-import com.adealink.frame.imkit.conversation.extension.IExtensionBoard
-import com.adealink.frame.imkit.conversation.extension.InputMode
-import com.adealink.frame.imkit.conversation.extension.emotion.EmoticonBoard
-import com.adealink.frame.imkit.feature.refrence.ReferenceManager
-import com.adealink.frame.imkit.utils.IMViewUtils
+import com.adealink.weparty.message.conversation.extension.ExtensionViewModel
+import com.adealink.weparty.message.conversation.extension.IExtensionBoard
+import com.adealink.weparty.message.conversation.extension.InputMode
+import com.adealink.weparty.message.conversation.extension.emotion.EmoticonBoard
+import com.adealink.weparty.message.conversation.extension.refrence.ReferenceManager
+import com.adealink.weparty.message.util.IMViewUtils
 import com.adealink.frame.imkit.utils.keyboard.KeyboardHeightObserver
 import com.adealink.frame.imkit.utils.keyboard.KeyboardHeightProvider
 import com.adealink.frame.log.Log
@@ -49,12 +50,10 @@ import com.adealink.weparty.module.message.data.ChatButtonStatus
 import com.adealink.weparty.module.message.data.ChatPageDetailRes
 import com.adealink.weparty.permission.PermissionUtils
 import io.rong.imlib.model.ConversationIdentifier
-import io.rong.imlib.model.UserProfileVisibility
 import io.rong.message.TextMessage
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
 import io.rong.imlib.model.Message as RMessage
-import com.adealink.frame.imkit.R as IM_KIT_R
 
 /**
  * 会话详情输入面板
@@ -130,6 +129,11 @@ class ConversationInputPanelFragment : BaseFragment(R.layout.layout_input_panel)
         this.toUid = this.conversationIdentifier?.targetId?.toLongOrNull()
     }
 
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+        loadData()
+    }
+
     override fun initViews() {
         initEditText()
         //表情面板
@@ -172,7 +176,7 @@ class ConversationInputPanelFragment : BaseFragment(R.layout.layout_input_panel)
 
             override fun onReferenceMessageRecall() {
                 CommonDialog.Builder()
-                    .message(getCompatString(IM_KIT_R.string.rc_recall_success))
+                    .message(getCompatString(R.string.rc_recall_success))
                     .onPositive {  }
                     .setShowDefaultCancel(false)
                     .show(childFragmentManager)

+ 6 - 6
frame/imkit/src/main/java/com/adealink/frame/imkit/MessageItemLongClickAction.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/longclick/MessageItemLongClickAction.kt

@@ -1,8 +1,8 @@
-package com.adealink.frame.imkit
+package com.adealink.weparty.message.conversation.extension.longclick
 
 import android.content.Context
 import com.adealink.frame.aab.util.getCompatString
-import com.adealink.frame.imkit.model.UiMessage
+import com.adealink.weparty.message.data.UiMessage
 
 class MessageItemLongClickAction private constructor(
     private val titleResId: Int,
@@ -103,11 +103,11 @@ class MessageItemLongClickAction private constructor(
         fun filter(message: UiMessage): Boolean
     }
 
-    override fun equals(o: Any?): Boolean {
-        if (this === o) return true
-        if (o == null || javaClass != o.javaClass) return false
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other == null || javaClass != other.javaClass) return false
 
-        val that = o as MessageItemLongClickAction
+        val that = other as MessageItemLongClickAction
 
         if (titleResId != that.titleResId) return false
         return title == that.title

+ 20 - 28
frame/imkit/src/main/java/com/adealink/frame/imkit/MessageItemLongClickActionManager.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/longclick/MessageItemLongClickActionManager.kt

@@ -1,20 +1,21 @@
-package com.adealink.frame.imkit
+package com.adealink.weparty.message.conversation.extension.longclick
 
 import android.content.ClipData
 import android.content.ClipboardManager
 import android.content.Context
 import android.net.Uri
 import android.text.TextUtils
-import android.widget.Toast
 import com.adealink.frame.aab.util.getCompatString
-import com.adealink.frame.imkit.config.IMConfigCenter
+import com.adealink.frame.imkit.IMService
+import com.adealink.weparty.message.R
+import com.adealink.weparty.message.config.IMConfigCenter
 import com.adealink.frame.imkit.manager.AudioPlayManager
 import com.adealink.frame.imkit.model.State
 import com.adealink.frame.imkit.model.TAG_IM_UI
-import com.adealink.frame.imkit.model.UiMessage
+import com.adealink.weparty.message.data.UiMessage
 import com.adealink.frame.imkit.resend.ResendManager
-import com.adealink.frame.imkit.utils.ToastUtils
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
+import com.adealink.weparty.commonui.toast.util.showToast
 import io.rong.imlib.RongIMClient
 import io.rong.imlib.common.NetUtils
 import io.rong.imlib.location.message.RealTimeLocationStartMessage
@@ -41,7 +42,7 @@ object MessageItemLongClickActionManager {
         initCommonMessageItemLongClickActions()
     }
 
-    //会话界面中,消息长按后的功能顺序为:复制、删除、撤回、引用(暂不支持)
+    //会话界面中,消息长按后的功能顺序为:复制、删除、撤回、引用
     private fun initCommonMessageItemLongClickActions() {
         var messageItemLongClickAction: MessageItemLongClickAction =
             MessageItemLongClickAction.Builder()
@@ -71,7 +72,7 @@ object MessageItemLongClickActionManager {
                                             )
                                         )
                                     } catch (e: Exception) {
-                                        LogUtil.e(
+                                        Log.e(
                                             TAG_IM_UI,
                                             "initCommonMessageItemLongClickActions TextMessage",
                                         )
@@ -88,7 +89,7 @@ object MessageItemLongClickActionManager {
                                             )
                                         )
                                     } catch (e: Exception) {
-                                        LogUtil.e(
+                                        Log.e(
                                             TAG_IM_UI,
                                             "initCommonMessageItemLongClickActions ReferenceMessage",
                                         )
@@ -168,7 +169,7 @@ object MessageItemLongClickActionManager {
                                             R.string
                                                 .rc_recall_failed_for_network_unavailable
                                         )
-                                ToastUtils.show(context, text, Toast.LENGTH_SHORT)
+                                showToast(text)
                                 return true
                             }
                             val deltaTime = RongIMClient.getInstance().deltaTime
@@ -180,8 +181,7 @@ object MessageItemLongClickActionManager {
                                     (normalTime - message.sentTime)
                                             <= messageRecallInterval * 1000)
                             if (needRecall) {
-                                IMService
-                                    .innerService
+                                IMService.innerService
                                     .recallMessage(
                                         uiMessage.getMessage(),
                                         null,
@@ -198,20 +198,13 @@ object MessageItemLongClickActionManager {
                                                             R.string
                                                                 .rc_recall_failed_for_network_unavailable
                                                         )
-                                                ToastUtils.show(
-                                                    context,
-                                                    text,
-                                                    Toast.LENGTH_SHORT
-                                                )
+                                                showToast(text)
+
                                             }
                                         })
                             } else {
-                                ToastUtils.show(
-                                    context,
-                                    getCompatString(R.string.rc_recall_overtime),
-                                    Toast.LENGTH_SHORT
-                                )
-                                LogUtil.e(TAG_IM_UI, "Failed to withdraw message")
+                                showToast(R.string.rc_recall_overtime)
+                                Log.e(TAG_IM_UI, "Failed to withdraw message")
                             }
                             return true
                         }
@@ -275,7 +268,7 @@ object MessageItemLongClickActionManager {
         // 无网络则删除失败,本地消息也不会删除
         val errorTxt = context.getString(R.string.rc_dialog_item_message_delete_failed_msg)
         if (!NetUtils.isNetWorkAvailable(context)) {
-            ToastUtils.show(context, errorTxt, Toast.LENGTH_SHORT)
+            showToast(errorTxt)
             return
         }
         IMService.innerService
@@ -288,19 +281,18 @@ object MessageItemLongClickActionManager {
                     }
 
                     override fun onError(errorCode: RongIMClient.ErrorCode) {
-                        LogUtil.e(
+                        Log.e(
                             TAG_IM_UI,
                             "deleteRemoteMessage fail, will not deleteLocalMessage :"
                                     + errorCode
                         )
-                        ToastUtils.show(context, errorTxt, Toast.LENGTH_SHORT)
+                        showToast(errorTxt)
                     }
                 })
     }
 
     private fun deleteLocalMessage(uiMessage: UiMessage) {
-        IMService
-            .innerService
+        IMService.innerService
             .deleteMessages(
                 uiMessage.getMessage().conversationType,
                 uiMessage.getMessage().targetId,

+ 2 - 3
frame/imkit/src/main/java/com/adealink/frame/imkit/conversation/viewmodel/MessageItemLongClickBean.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/longclick/MessageItemLongClickBean.kt

@@ -1,7 +1,6 @@
-package com.adealink.frame.imkit.conversation.viewmodel
+package com.adealink.weparty.message.conversation.extension.longclick
 
-import com.adealink.frame.imkit.MessageItemLongClickAction
-import com.adealink.frame.imkit.model.UiMessage
+import com.adealink.weparty.message.data.UiMessage
 
 
 class MessageItemLongClickBean(

+ 10 - 10
frame/imkit/src/main/java/com/adealink/frame/imkit/feature/refrence/ReferenceManager.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/refrence/ReferenceManager.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.feature.refrence
+package com.adealink.weparty.message.conversation.extension.refrence
 
 import android.content.Context
 import android.text.TextUtils
@@ -7,11 +7,9 @@ import android.view.ViewGroup
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
 import com.adealink.frame.imkit.IMService
-import com.adealink.frame.imkit.MessageItemLongClickAction
-import com.adealink.frame.imkit.MessageItemLongClickActionManager
-import com.adealink.frame.imkit.R
-import com.adealink.frame.imkit.conversation.extension.ExtensionViewModel
-import com.adealink.frame.imkit.conversation.extension.InputMode
+import com.adealink.weparty.message.R
+import com.adealink.weparty.message.conversation.extension.ExtensionViewModel
+import com.adealink.weparty.message.conversation.extension.InputMode
 import com.adealink.frame.imkit.event.actionevent.ClearEvent
 import com.adealink.frame.imkit.event.actionevent.DeleteEvent
 import com.adealink.frame.imkit.event.actionevent.DownloadEvent
@@ -21,9 +19,11 @@ import com.adealink.frame.imkit.event.actionevent.RecallEvent
 import com.adealink.frame.imkit.event.actionevent.RefreshEvent
 import com.adealink.frame.imkit.event.actionevent.SendEvent
 import com.adealink.frame.imkit.event.actionevent.SendMediaEvent
-import com.adealink.frame.imkit.model.TAG_IM_REFERENCE
-import com.adealink.frame.imkit.model.UiMessage
-import com.adealink.frame.imkit.utils.LogUtil
+import com.adealink.frame.log.Log
+import com.adealink.weparty.message.constant.TAG_IM_REFERENCE
+import com.adealink.weparty.message.data.UiMessage
+import com.adealink.weparty.message.conversation.extension.longclick.MessageItemLongClickAction
+import com.adealink.weparty.message.conversation.extension.longclick.MessageItemLongClickActionManager
 import io.rong.imlib.RongIMClient
 import io.rong.imlib.model.Conversation
 import io.rong.imlib.model.Message
@@ -186,7 +186,7 @@ class ReferenceManager {
 
     fun processReference(message: Message) {
         if (message.content !is TextMessage) {
-            LogUtil.e(TAG_IM_REFERENCE, "primary message content must be TextMessage")
+            Log.e(TAG_IM_REFERENCE, "primary message content must be TextMessage")
             return
         }
         val primaryString = (message.content as? TextMessage)?.content

+ 47 - 32
frame/imkit/src/main/java/com/adealink/frame/imkit/feature/refrence/ReferenceMessageItemProvider.kt → module/message/src/main/java/com/adealink/weparty/message/conversation/extension/refrence/ReferenceMessageItemProvider.kt

@@ -1,4 +1,4 @@
-package com.adealink.frame.imkit.feature.refrence
+package com.adealink.weparty.message.conversation.extension.refrence
 
 import android.annotation.SuppressLint
 import android.content.Context
@@ -19,16 +19,17 @@ import android.widget.TextView
 import androidx.core.text.TextUtilsCompat
 import com.adealink.frame.aab.util.getCompatColor
 import com.adealink.frame.image.view.NetworkImageView
-import com.adealink.frame.imkit.IMService
-import com.adealink.frame.imkit.R
-import com.adealink.frame.imkit.conversation.messagelist.provider.BaseMessageItemProvider
-import com.adealink.frame.imkit.conversation.messagelist.provider.MessageClickType
-import com.adealink.frame.imkit.model.UiMessage
-import com.adealink.frame.imkit.userinfo.IMUserInfoManager
-import com.adealink.frame.imkit.utils.TextViewUtils
+import com.adealink.weparty.message.R
+import com.adealink.weparty.message.conversation.provider.BaseMessageItemProvider
+import com.adealink.weparty.message.conversation.provider.MessageClickType
+import com.adealink.weparty.message.data.UiMessage
+import com.adealink.weparty.message.userinfo.IMUserInfoManager
+import com.adealink.weparty.message.util.TextViewUtils
 import com.adealink.frame.imkit.widget.LinkTextViewMovementMethod
 import com.adealink.frame.imkit.widget.adapter.IViewProviderListener
 import com.adealink.frame.imkit.widget.adapter.ViewHolder
+import com.adealink.weparty.message.util.IMRouteUtils
+import com.adealink.weparty.message.util.RegularCallBack
 import io.rong.imlib.model.Message
 import io.rong.imlib.model.MessageContent
 import io.rong.message.ImageMessage
@@ -65,7 +66,10 @@ class ReferenceMessageItemProvider : BaseMessageItemProvider<ReferenceMessage>()
                 getDisplayName(uiMessage, referenceMessage.userId) + " : "
             )
             val isSender = uiMessage.getMessage().messageDirection == Message.MessageDirection.SEND
-            holder.setTextColor(R.id.im_msg_tv_reference_send_content, if (isSender) getCompatColor(R.color.im_white_color) else getCompatColor(R.color.im_text_main_color))
+            holder.setTextColor(
+                R.id.im_msg_tv_reference_send_content,
+                if (isSender) getCompatColor(R.color.im_white_color) else getCompatColor(R.color.im_text_main_color)
+            )
         }
         if (referenceSendContent != null && referenceMessage.editSendText != null) {
             setTextContent(
@@ -205,14 +209,20 @@ class ReferenceMessageItemProvider : BaseMessageItemProvider<ReferenceMessage>()
             if (data.contentSpannable == null) {
                 val spannable =
                     TextViewUtils.getSpannable(
-                        content,
-                        false
-                    ) { spannable ->
-                        data.contentSpannable = spannable
-                        if (textView.tag == data.messageId) {
-                            textView.post { textView.text = data.contentSpannable }
+                        content = content,
+                        regular = false,
+                        callBack = object : RegularCallBack {
+                            override fun finish(spannable: SpannableStringBuilder?) {
+                                data.contentSpannable = spannable
+                                if (textView.tag == data.messageId) {
+                                    textView.post {
+                                        textView.text = data
+                                            .contentSpannable
+                                    }
+                                }
+                            }
                         }
-                    }
+                    )
                 data.contentSpannable = spannable
             }
             textView.text = data.contentSpannable
@@ -221,16 +231,19 @@ class ReferenceMessageItemProvider : BaseMessageItemProvider<ReferenceMessage>()
                 val spannable =
                     TextViewUtils.getSpannable(
                         content,
-                        false
-                    ) { spannable ->
-                        data.referenceContentSpannable = spannable
-                        if (textView.tag == data.messageId) {
-                            textView.post {
-                                textView.text = data
-                                    .referenceContentSpannable
+                        false,
+                        callBack = object : RegularCallBack {
+                            override fun finish(spannable: SpannableStringBuilder?) {
+                                data.referenceContentSpannable = spannable
+                                if (textView.tag == data.messageId) {
+                                    textView.post {
+                                        textView.text = data
+                                            .referenceContentSpannable
+                                    }
+                                }
                             }
                         }
-                    }
+                    )
                 data.referenceContentSpannable = spannable
             }
             textView.text = data.referenceContentSpannable
@@ -242,7 +255,7 @@ class ReferenceMessageItemProvider : BaseMessageItemProvider<ReferenceMessage>()
             var result = false
             val str = link.lowercase(Locale.getDefault())
             if (str.startsWith("http") || str.startsWith("https")) {
-                IMService.innerService.config.routeUrl(link)
+                IMRouteUtils.routeUrl(link)
                 result = true
             }
             result
@@ -366,12 +379,14 @@ class ReferenceMessageItemProvider : BaseMessageItemProvider<ReferenceMessage>()
             val spannable =
                 TextViewUtils.getRichSpannable(
                     string,
-                    { spannable ->
-                        uiMessage.referenceContentSpannable = spannable
-                        if (textView.tag == uiMessage.messageId) {
-                            textView.post {
-                                textView.text = uiMessage
-                                    .referenceContentSpannable
+                    callBack = object : RegularCallBack {
+                        override fun finish(spannable: SpannableStringBuilder?) {
+                            uiMessage.referenceContentSpannable = spannable
+                            if (textView.tag == uiMessage.messageId) {
+                                textView.post {
+                                    textView.text = uiMessage
+                                        .referenceContentSpannable
+                                }
                             }
                         }
                     },
@@ -382,7 +397,7 @@ class ReferenceMessageItemProvider : BaseMessageItemProvider<ReferenceMessage>()
         textView.text = uiMessage.referenceContentSpannable
         holder.setOnClickListener(
             R.id.im_msg_tv_reference_content
-        ) { IMService.innerService.config.routeUrl(content.url) }
+        ) { IMRouteUtils.routeUrl(content.url) }
         holder.setOnLongClickListener(
             R.id.im_msg_tv_reference_content
         ) { parentHolder.getView<View>(R.id.im_content)?.performLongClick() == true }

Некоторые файлы не были показаны из-за большого количества измененных файлов