|
|
@@ -2,11 +2,14 @@ package com.adealink.weparty.im.list.adapter.viewbinder
|
|
|
|
|
|
import android.view.LayoutInflater
|
|
|
import android.view.ViewGroup
|
|
|
+import androidx.lifecycle.LifecycleOwner
|
|
|
+import androidx.lifecycle.Observer
|
|
|
import com.adealink.frame.base.AppBase
|
|
|
import com.adealink.frame.data.json.froJsonErrorNull
|
|
|
import com.adealink.frame.dot.NumDot
|
|
|
import com.adealink.frame.util.onClick
|
|
|
import com.adealink.weparty.commonui.ext.gone
|
|
|
+import com.adealink.weparty.commonui.ext.isViewValid
|
|
|
import com.adealink.weparty.commonui.ext.show
|
|
|
import com.adealink.weparty.commonui.recycleview.adapter.BindingViewHolder
|
|
|
import com.adealink.weparty.commonui.recycleview.adapter.multitype.ItemViewBinder
|
|
|
@@ -22,109 +25,149 @@ import com.tencent.qcloud.tuikit.tuiconversation.presenter.ConversationPresenter
|
|
|
|
|
|
|
|
|
class SessionListItemViewBinder(
|
|
|
- val listener: OnConversationAdapterListener,
|
|
|
- val onAvatarClick: (uid: String) -> Unit,
|
|
|
- val userInfoListener: IUserInfoListener,
|
|
|
+ private val lifecycleOwner: LifecycleOwner,
|
|
|
+ private val listener: OnConversationAdapterListener,
|
|
|
+ private val onAvatarClick: (uid: String) -> Unit,
|
|
|
+ private val userInfoListener: IUserInfoListener,
|
|
|
) :
|
|
|
- ItemViewBinder<CommonSessionListItemData, BindingViewHolder<LayoutSessionListItemBinding>>() {
|
|
|
+ ItemViewBinder<CommonSessionListItemData, SessionListItemViewBinder.ViewHolder>() {
|
|
|
|
|
|
override fun onBindViewHolder(
|
|
|
- holder: BindingViewHolder<LayoutSessionListItemBinding>,
|
|
|
- item: CommonSessionListItemData,
|
|
|
+ holder: ViewHolder,
|
|
|
+ item: CommonSessionListItemData
|
|
|
) {
|
|
|
- holder.binding.root.onClick {
|
|
|
- listener.onItemClick(it, item.data.type, item.data)
|
|
|
- }
|
|
|
+ holder.update(holder, item)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onCreateViewHolder(inflater: LayoutInflater, parent: ViewGroup): ViewHolder {
|
|
|
+ return ViewHolder(
|
|
|
+ LayoutSessionListItemBinding.inflate(inflater, parent, false)
|
|
|
+ )
|
|
|
+ }
|
|
|
|
|
|
- val uid = item.data.id
|
|
|
- holder.binding.ivAvatar.onClick {
|
|
|
- onAvatarClick.invoke(item.data.id)
|
|
|
- }
|
|
|
- userInfoListener.getUserInfo(uid) { userInfo ->
|
|
|
- updateUserInfo(holder, item, userInfo)
|
|
|
- }
|
|
|
|
|
|
- val online = ProfileModule.isUserOnline(uid)
|
|
|
- if (online) {
|
|
|
- holder.binding.vOnline.show()
|
|
|
- holder.binding.vOnline.onStart()
|
|
|
- } else {
|
|
|
- holder.binding.vOnline.gone()
|
|
|
- holder.binding.vOnline.onStop()
|
|
|
+ override fun onViewDetachedFromWindow(holder: ViewHolder) {
|
|
|
+ super.onViewDetachedFromWindow(holder)
|
|
|
+ holder.binding.vOnline.onStop()
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onViewRecycled(holder: ViewHolder) {
|
|
|
+ holder.binding.vOnline.onStop()
|
|
|
+ super.onViewRecycled(holder)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ inner class ViewHolder(
|
|
|
+ binding: LayoutSessionListItemBinding,
|
|
|
+ ) : BindingViewHolder<LayoutSessionListItemBinding>(binding) {
|
|
|
+
|
|
|
+ private var item: CommonSessionListItemData? = null
|
|
|
+
|
|
|
+ fun initView() {
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- setLastMessageAndStatus(holder, item)
|
|
|
+ private val onlineObserver = object : Observer<Boolean> {
|
|
|
|
|
|
- // TODO: 长按测试用
|
|
|
- if (!AppBase.isRelease) {
|
|
|
- holder.binding.root.setOnLongClickListener {
|
|
|
- listener.onItemLongClick(it, item.data)
|
|
|
- true
|
|
|
+ var holder: ViewHolder? = null
|
|
|
+
|
|
|
+ override fun onChanged(value: Boolean) {
|
|
|
+ val holder = holder
|
|
|
+ if (holder == null || !holder.isViewValid()) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ updateUserOnline(value)
|
|
|
}
|
|
|
}
|
|
|
- }
|
|
|
|
|
|
- private fun updateUserInfo(
|
|
|
- holder: BindingViewHolder<LayoutSessionListItemBinding>,
|
|
|
- item: CommonSessionListItemData,
|
|
|
- userInfo: UserInfo?
|
|
|
- ) {
|
|
|
- holder.binding.ivAvatar.setImageUrl(userInfo?.avatar)
|
|
|
- holder.binding.tvTitle.text = userInfo?.nickName ?: item.data.title
|
|
|
-
|
|
|
- }
|
|
|
+ fun update(holder: ViewHolder, item: CommonSessionListItemData) {
|
|
|
+ resetItem(this.item)
|
|
|
+ this.item = item
|
|
|
+ onlineObserver.holder = holder
|
|
|
+ binding.root.onClick {
|
|
|
+ listener.onItemClick(it, item.data.type, item.data)
|
|
|
+ }
|
|
|
|
|
|
- private fun setLastMessageAndStatus(
|
|
|
- holder: BindingViewHolder<LayoutSessionListItemBinding>,
|
|
|
- item: CommonSessionListItemData,
|
|
|
- ) {
|
|
|
- val conversation = item.data
|
|
|
-
|
|
|
- val draftInfo: DraftInfo? = conversation.draft
|
|
|
- if (draftInfo != null) {
|
|
|
- //草稿
|
|
|
- val draftText =
|
|
|
- (froJsonErrorNull<HashMap<*, *>>(draftInfo.draftText)?.get("content") as? String)
|
|
|
- ?: draftInfo.draftText
|
|
|
-
|
|
|
- holder.binding.tvDesc.text = draftText
|
|
|
- setLastMessageTime(holder, draftInfo.draftTime)
|
|
|
- } else {
|
|
|
- //上一条消息
|
|
|
- val lasTUIMessageBean = conversation.lastTUIMessageBean
|
|
|
- if (lasTUIMessageBean != null) {
|
|
|
- val displayString = ConversationPresenter.getMessageDisplayString(lasTUIMessageBean)
|
|
|
- holder.binding.tvDesc.text = displayString
|
|
|
+ val uid = item.data.id
|
|
|
+ binding.ivAvatar.onClick {
|
|
|
+ onAvatarClick.invoke(item.data.id)
|
|
|
+ }
|
|
|
+ userInfoListener.getUserInfo(uid) { userInfo ->
|
|
|
+ updateUserInfo(item, userInfo)
|
|
|
}
|
|
|
- if (conversation.lastMessage != null) {
|
|
|
- setLastMessageTime(holder, conversation.lastMessageTime * 1000)
|
|
|
+
|
|
|
+ val online = ProfileModule.isUserOnline(uid)
|
|
|
+ updateUserOnline(online)
|
|
|
+ ProfileModule.observeUserOnline(uid).observe(lifecycleOwner, onlineObserver)
|
|
|
+ setLastMessageAndStatus(binding, item)
|
|
|
+
|
|
|
+ // TODO: 长按测试用
|
|
|
+ if (!AppBase.isRelease) {
|
|
|
+ binding.root.setOnLongClickListener {
|
|
|
+ listener.onItemLongClick(it, item.data)
|
|
|
+ true
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- holder.binding.vDot.show(NumDot(conversation.unRead))
|
|
|
- }
|
|
|
+ private fun resetItem(item: CommonSessionListItemData?) {
|
|
|
+ item ?: return
|
|
|
+ val uid = item.data.id
|
|
|
+ ProfileModule.observeUserOnline(uid).removeObserver(onlineObserver)
|
|
|
+ }
|
|
|
|
|
|
- private fun setLastMessageTime(
|
|
|
- holder: BindingViewHolder<LayoutSessionListItemBinding>,
|
|
|
- timeTs: Long
|
|
|
- ) {
|
|
|
- holder.binding.tvTime.text = timeTs.formatTimeStr()
|
|
|
- }
|
|
|
+ private fun setLastMessageAndStatus(
|
|
|
+ binding: LayoutSessionListItemBinding,
|
|
|
+ item: CommonSessionListItemData,
|
|
|
+ ) {
|
|
|
+ val conversation = item.data
|
|
|
+
|
|
|
+ val draftInfo: DraftInfo? = conversation.draft
|
|
|
+ if (draftInfo != null) {
|
|
|
+ //草稿
|
|
|
+ val draftText =
|
|
|
+ (froJsonErrorNull<HashMap<*, *>>(draftInfo.draftText)?.get("content") as? String)
|
|
|
+ ?: draftInfo.draftText
|
|
|
+
|
|
|
+ binding.tvDesc.text = draftText
|
|
|
+ setLastMessageTime(draftInfo.draftTime)
|
|
|
+ } else {
|
|
|
+ //上一条消息
|
|
|
+ val lasTUIMessageBean = conversation.lastTUIMessageBean
|
|
|
+ if (lasTUIMessageBean != null) {
|
|
|
+ val displayString =
|
|
|
+ ConversationPresenter.getMessageDisplayString(lasTUIMessageBean)
|
|
|
+ binding.tvDesc.text = displayString
|
|
|
+ }
|
|
|
+ if (conversation.lastMessage != null) {
|
|
|
+ setLastMessageTime(conversation.lastMessageTime * 1000)
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- override fun onCreateViewHolder(
|
|
|
- inflater: LayoutInflater,
|
|
|
- parent: ViewGroup,
|
|
|
- ): BindingViewHolder<LayoutSessionListItemBinding> {
|
|
|
- return BindingViewHolder(LayoutSessionListItemBinding.inflate(inflater, parent, false))
|
|
|
- }
|
|
|
+ binding.vDot.show(NumDot(conversation.unRead))
|
|
|
+ }
|
|
|
|
|
|
- override fun onViewDetachedFromWindow(holder: BindingViewHolder<LayoutSessionListItemBinding>) {
|
|
|
- super.onViewDetachedFromWindow(holder)
|
|
|
- holder.binding.vOnline.onStop()
|
|
|
- }
|
|
|
+ private fun setLastMessageTime(timeTs: Long) {
|
|
|
+ binding.tvTime.text = timeTs.formatTimeStr()
|
|
|
+ }
|
|
|
|
|
|
- override fun onViewRecycled(holder: BindingViewHolder<LayoutSessionListItemBinding>) {
|
|
|
- holder.binding.vOnline.onStop()
|
|
|
- super.onViewRecycled(holder)
|
|
|
+ private fun updateUserInfo(
|
|
|
+ item: CommonSessionListItemData,
|
|
|
+ userInfo: UserInfo?
|
|
|
+ ) {
|
|
|
+ binding.ivAvatar.setImageUrl(userInfo?.avatar)
|
|
|
+ binding.tvTitle.text = userInfo?.nickName ?: item.data.title
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun updateUserOnline(online: Boolean) {
|
|
|
+ if (online) {
|
|
|
+ binding.vOnline.show()
|
|
|
+ binding.vOnline.onStart()
|
|
|
+ } else {
|
|
|
+ binding.vOnline.gone()
|
|
|
+ binding.vOnline.onStop()
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|