From 6eedd5cc4623b614e259348c118cb3dce508d8ee Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 30 Oct 2023 19:30:26 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=90=8C=E7=B1=BB=E5=9E=8B=E6=88=BF=E9=97=B4=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E7=9A=84Widget=E6=9C=AA=E6=9B=B4=E6=96=B0Context?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/fragment/GameRoomFragment.kt | 5 -- .../fragment/HomePartyRoomFragment.java | 6 -- .../avroom/fragment/SingleRoomFragment.kt | 5 -- .../avroom/redpackage/RedPackageHandler.kt | 9 ++ .../avroom/redpackage/RedPackageWidget.kt | 86 +++++++++---------- .../main/res/layout/red_package_widget.xml | 83 +++++++++--------- .../support/room/FrameLayoutRoomWidget.kt | 80 +++++++++++++++++ .../support/room/RoomWidget.kt | 4 +- 8 files changed, 175 insertions(+), 103 deletions(-) create mode 100644 core/src/main/java/com/yizhuan/xchat_android_core/support/room/FrameLayoutRoomWidget.kt diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/GameRoomFragment.kt b/app/src/main/java/com/yizhuan/erban/avroom/fragment/GameRoomFragment.kt index 4321dcd7c..d9304301a 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/GameRoomFragment.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/GameRoomFragment.kt @@ -194,11 +194,6 @@ class GameRoomFragment : BaseRoomFragment(), super.onDestroy() } - override fun onDestroyView() { - super.onDestroyView() - gameBinding.redPackageWidget.onStop() - } - override fun initWidget() { super.initWidget() registerWidget(RedPackageWidget::class.java.simpleName, gameBinding.redPackageWidget) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java index d56032978..142412ea5 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/fragment/HomePartyRoomFragment.java @@ -533,12 +533,6 @@ public class HomePartyRoomFragment extends BaseRoomFragment handleRoomRedPackage(data, false) }, { + logD("Handler requestLatestRoomRedPackage null","MAAAX") if (it.message == "No RedPackage") { updateIcon(null) } else { @@ -100,6 +107,7 @@ class RedPackageHandler : RoomHandler() { * @param isSignaling 是否来自信令? */ private fun handleRoomRedPackage(data: RedPackageNotifyInfo, isSignaling: Boolean) { + logD("Handler handleRoomRedPackage isSignaling:$isSignaling","MAAAX") tryShowOpenDialog(data, isSignaling) updateIcon(data) } @@ -108,6 +116,7 @@ class RedPackageHandler : RoomHandler() { * 更新红包入口图标 */ private fun updateIcon(data: RedPackageNotifyInfo?) { + logD("Handler updateIcon","MAAAX") iconLiveData.postValue(data) } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/redpackage/RedPackageWidget.kt b/app/src/main/java/com/yizhuan/erban/avroom/redpackage/RedPackageWidget.kt index 7082daf12..941d01dfc 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/redpackage/RedPackageWidget.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/redpackage/RedPackageWidget.kt @@ -4,17 +4,17 @@ import android.content.Context import android.util.AttributeSet import android.util.TypedValue import android.view.LayoutInflater -import android.widget.TextView -import androidx.constraintlayout.widget.ConstraintLayout import androidx.core.view.isVisible -import androidx.lifecycle.Observer +import androidx.databinding.DataBindingUtil import com.chuhai.utils.ServiceTime import com.chuhai.utils.ktx.singleClick import com.yizhuan.erban.R import com.yizhuan.erban.avroom.redpackage.open.RedPackageOpenDialog import com.yizhuan.erban.common.widget.dialog.DialogManager +import com.yizhuan.erban.databinding.RedPackageWidgetBinding import com.yizhuan.xchat_android_core.redpackage.RedPackageModel import com.yizhuan.xchat_android_core.redpackage.RedPackageNotifyInfo +import com.yizhuan.xchat_android_core.support.room.FrameLayoutRoomWidget import com.yizhuan.xchat_android_core.support.room.RoomContext import com.yizhuan.xchat_android_core.support.room.RoomView import com.yizhuan.xchat_android_core.support.room.RoomWidget @@ -32,10 +32,7 @@ import java.util.concurrent.TimeUnit * Created by Max on 2023/10/24 16:37 * Desc:房间内的红包入口 **/ -class RedPackageWidget : ConstraintLayout, RoomWidget { - private var roomView: RoomView? = null - private var textView: TextView? = null - private var numView: TextView? = null +class RedPackageWidget : FrameLayoutRoomWidget, RoomWidget { private var countDownDisposable: Disposable? = null private var data: RedPackageNotifyInfo? = null private val redPackageHandler: RedPackageHandler? @@ -52,18 +49,12 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { } } - // 为了获取到RoomContext - private val contextObserver = object : Observer { - override fun onChanged(value: RoomContext?) { - if (value != null) { - RoomContext.contextLiveData.removeObserver(this) - val view = this@RedPackageWidget.roomView - if (view != null) { - init(view) - } - } - } - } + private val binding: RedPackageWidgetBinding = + DataBindingUtil.inflate( + LayoutInflater.from( + context + ), R.layout.red_package_widget, this, true + ) private val compositeDisposable = CompositeDisposable() @@ -85,10 +76,6 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { init { // 默认不可见 this.isVisible = false - LayoutInflater.from(context) - .inflate(R.layout.red_package_widget, this, true) - textView = findViewById(R.id.tv_text) - numView = findViewById(R.id.tv_num) this.setBackgroundResource(R.drawable.red_package_widget_bg) singleClick { data?.let { @@ -113,7 +100,7 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { .doOnNext { val gap = time - ServiceTime.time if (gap >= 0) { - textView?.text = mmssFormat.format(gap) + binding.tvText.text = mmssFormat.format(gap) } } .doOnComplete { @@ -128,33 +115,30 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { */ private fun switchUI(isCountDown: Boolean) { if (isCountDown) { - textView?.setBackgroundResource(R.drawable.shape_99292929_8) - textView?.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10f) + binding.tvText.setBackgroundResource(R.drawable.shape_99292929_8) + binding.tvText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 10f) } else { - textView?.setBackgroundResource(R.drawable.red_package_widget_bg_text) - textView?.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 9f) - textView?.setText(R.string.red_package_widget_get) + binding.tvText.setBackgroundResource(R.drawable.red_package_widget_bg_text) + binding.tvText.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 9f) + binding.tvText.setText(R.string.red_package_widget_get) } } override fun onStart(roomView: RoomView) { - this.roomView = roomView + super.onStart(roomView) + logD("Widget onStart", "MAAAX") roomView.getActivity()?.let { this.dialogManager = DialogManager(it) this.dialogManager?.setCanceledOnClickOutside(false) } - // TODO #临时方案 因为目前View的生命周期比RoomContext还早,暂时这样拿到Context - val context = RoomContext.contextLiveData.value - if (context == null) { - RoomContext.contextLiveData.observeForever(contextObserver) - } else { - init(roomView) - } } - private fun init(roomView: RoomView) { + override fun onInitialize(roomView: RoomView, roomContext: RoomContext) { + super.onInitialize(roomView, roomContext) + logD("Widget onInitialize", "MAAAX") val lifecycleOwner = roomView.getLifecycleOwner() redPackageHandler?.iconLiveData?.observe(lifecycleOwner) { + logD("Widget iconLiveData $it", "MAAAX") loadData(it) } } @@ -169,13 +153,13 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { val num = data.redEnvelopeNum if (num > 0) { if (num > 99) { - numView?.text = "99+" + binding.tvNum.text = "99+" } else { - numView?.text = num.toString() + binding.tvNum.text = num.toString() } - numView?.isVisible = true + binding.tvNum.isVisible = true } else { - numView?.isVisible = false + binding.tvNum.isVisible = false } if (data.validityType == 1) { // 限时生效 @@ -226,14 +210,26 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { } override fun onStop() { - compositeDisposable.dispose() - RoomContext.contextLiveData.removeObserver(contextObserver) - stopCountDown() + super.onStop() + logD("Widget onStop", "MAAAX") this.dialogManager?.dismissDialog() this.dialogManager = null this.roomView = null } + override fun onUnbindContext() { + super.onUnbindContext() + logD("Widget onUnbindContext", "MAAAX") + compositeDisposable.dispose() + stopCountDown() + loadData(null) + } + + override fun onBindContext(roomContext: RoomContext) { + super.onBindContext(roomContext) + logD("Widget onBindContext", "MAAAX") + } + private fun stopCountDown() { if (countDownDisposable?.isDisposed == false) { countDownDisposable?.dispose() diff --git a/app/src/main/res/layout/red_package_widget.xml b/app/src/main/res/layout/red_package_widget.xml index fd29d57fc..9ddba6de7 100644 --- a/app/src/main/res/layout/red_package_widget.xml +++ b/app/src/main/res/layout/red_package_widget.xml @@ -1,43 +1,46 @@ - + - + - - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/support/room/FrameLayoutRoomWidget.kt b/core/src/main/java/com/yizhuan/xchat_android_core/support/room/FrameLayoutRoomWidget.kt new file mode 100644 index 000000000..633acdd36 --- /dev/null +++ b/core/src/main/java/com/yizhuan/xchat_android_core/support/room/FrameLayoutRoomWidget.kt @@ -0,0 +1,80 @@ +package com.yizhuan.xchat_android_core.support.room + +import android.content.Context +import android.util.AttributeSet +import android.widget.FrameLayout +import androidx.annotation.CallSuper +import androidx.lifecycle.Observer + +/** + * Created by Max on 2023/10/30 18:20 + * Desc:FrameLayout版本的房间组件 + * PS:由于目前房间架构支持同类型房间View层共用+目前的房间生命周期很不清晰!所以下面相关代码都在解决何时初始化、何时解绑等!! + **/ +abstract class FrameLayoutRoomWidget : FrameLayout, RoomWidget { + + protected var roomView: RoomView? = null + + // 当前房间UID + private var roomId: Long? = null + + // 为了获取到RoomContext + private val contextObserver = + Observer { value -> + if (roomId != null && (value == null || roomId != value.roomId)) { + onUnbindContext() + } + roomId = value?.roomId + if (value != null) { + onBindContext(value) + this.roomView?.let { + onInitialize(it, value) + } + } + } + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super( + context, + attrs, + defStyleAttr + ) + + constructor( + context: Context, + attrs: AttributeSet?, + defStyleAttr: Int, + defStyleRes: Int + ) : super(context, attrs, defStyleAttr, defStyleRes) + + @CallSuper + override fun onStart(roomView: RoomView) { + this.roomView = roomView + RoomContext.contextLiveData.observeForever(contextObserver) + } + + @CallSuper + override fun onStop() { + // 注销监听 + RoomContext.contextLiveData.removeObserver(contextObserver) + // 解绑 + onUnbindContext() + this.roomView = null + } + + /** + * 绑定房间上下文:建立数据连接 + */ + open fun onBindContext(roomContext: RoomContext) {} + + /** + * 解绑上下文:重置View状态 + */ + open fun onUnbindContext() {} + + /** + * 初始化(View+Context) + */ + open fun onInitialize(roomView: RoomView, roomContext: RoomContext) {} +} \ No newline at end of file diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/support/room/RoomWidget.kt b/core/src/main/java/com/yizhuan/xchat_android_core/support/room/RoomWidget.kt index 67410f18e..568867cc5 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/support/room/RoomWidget.kt +++ b/core/src/main/java/com/yizhuan/xchat_android_core/support/room/RoomWidget.kt @@ -9,12 +9,12 @@ import com.chuhai.utils.log.ILog interface RoomWidget : ILog { /** - * 组件激活 + * 开始(View层) */ fun onStart(roomView: RoomView) /** - * 组件停止 + * 结束(View层) */ fun onStop() } \ No newline at end of file