From 57139f1f97015456f113499e26bce29ffebab8a1 Mon Sep 17 00:00:00 2001 From: Max Date: Fri, 27 Oct 2023 16:32:54 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E5=96=84=E5=85=A8=E6=9C=8D?= =?UTF-8?q?=E7=BA=A2=E5=8C=85=E8=B7=B3=E8=BD=AC=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../erban/avroom/activity/AVRoomActivity.java | 71 ++++------ .../avroom/redpackage/RedPackageHandler.kt | 54 +++++--- .../avroom/redpackage/RedPackageWidget.kt | 26 +++- .../redpackage/open/RedPackageOpenDialog2.kt | 123 ++++++++++++------ .../open/RedPackageResultAdapter.kt | 6 - .../com/yizhuan/erban/base/BaseActivity.java | 3 +- app/src/main/res/values/strings.xml | 3 +- .../redpackage/RedPackageData.kt | 4 +- 8 files changed, 177 insertions(+), 113 deletions(-) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java index 682c3113f..b65cb15db 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java @@ -67,7 +67,7 @@ import com.yizhuan.erban.avroom.fragment.HomePartyFragment; import com.yizhuan.erban.avroom.fragment.InputPwdDialogFragment; import com.yizhuan.erban.avroom.presenter.AvRoomPresenter; import com.yizhuan.erban.avroom.presenter.HomePartyPresenter; -import com.yizhuan.erban.avroom.redpackage.RedPackageOpenDialog; +import com.yizhuan.erban.avroom.redpackage.RedPackageHandler; import com.yizhuan.erban.avroom.view.IAvRoomView; import com.yizhuan.erban.avroom.widget.VerticalViewPagerAdapter; import com.yizhuan.erban.base.BaseMvpActivity; @@ -130,7 +130,6 @@ import com.yizhuan.xchat_android_core.patriarch.event.CloseMinRoomEvent; import com.yizhuan.xchat_android_core.patriarch.event.ImPushMsgPmLimitTimeEvent; import com.yizhuan.xchat_android_core.patriarch.event.PmDismissAllLimitDialogEvent; import com.yizhuan.xchat_android_core.patriarch.exception.PmRoomLimitException; -import com.yizhuan.xchat_android_core.redpackage.RedPackageModel; import com.yizhuan.xchat_android_core.redpackage.RedPackageNotifyInfo; import com.yizhuan.xchat_android_core.room.anotherroompk.ShowGiftDialogEvent; import com.yizhuan.xchat_android_core.room.bean.RoomInfo; @@ -164,9 +163,7 @@ import org.greenrobot.eventbus.ThreadMode; import java.lang.ref.WeakReference; import java.net.MalformedURLException; import java.net.URL; -import java.util.ArrayList; import java.util.LinkedList; -import java.util.List; import java.util.Objects; import java.util.concurrent.TimeUnit; @@ -221,7 +218,6 @@ public class AVRoomActivity extends BaseMvpActivity openDialogs; private ViewPager2 viewpager; private VerticalViewPagerAdapter mAdapter; /*********************************显示全服礼物***************************************/ @@ -514,7 +510,6 @@ public class AVRoomActivity extends BaseMvpActivity redMap = DemoCache.readRedPackage(); -// RedPackageModel.INSTANCE.getRedPackage(roomInfo.getUid()) -// .compose(bindToLifecycle()) -// .doFinally(() -> { -// if (inRoomNotifyInfo != null && (redMap == null || !redMap.containsKey(inRoomNotifyInfo.getRedEnvelopeId()))) { -// showRedPackageOpenDialog(inRoomNotifyInfo); -// } -// }) -// .filter(notifyInfo -> inRoomNotifyInfo == null || !notifyInfo.getRedEnvelopeId().equals(inRoomNotifyInfo.getRedEnvelopeId())) -// .subscribe(this::showRedPackageOpenDialog); - } - - private void showRedPackageOpenDialog(RedPackageNotifyInfo notifyInfo) { - if (!isResume) return; - if (openDialogs == null) { - openDialogs = new ArrayList<>(); - } - RedPackageOpenDialog openDialog = RedPackageOpenDialog.Companion.newInstance(notifyInfo); - openDialog.show(this); - if (openDialog.getDialog() != null) { - openDialog.getDialog().setOnDismissListener(dialog -> openDialogs.remove(openDialog)); - } - openDialogs.add(openDialog); - if (openDialogs.size() >= SHOW_RED_DIALOG_MAX) { - openDialogs.get(SHOW_RED_DIALOG_MAX - 1).dismissAllowingStateLoss(); + /** + * 尝试展示来源红包(在房间外点击红包入口进入房间时) + */ + private void tryShowSourceRedPackage() { + try { + RedPackageNotifyInfo inRoomNotifyInfo = (RedPackageNotifyInfo) getIntent().getSerializableExtra("notifyInfo"); + if (inRoomNotifyInfo != null) { + RedPackageHandler handler = getRoomContext().findAbility(RedPackageHandler.class.getSimpleName()); + if (handler != null) { + long id = Long.parseLong(inRoomNotifyInfo.getRedEnvelopeId()); + handler.tryShowRedPackage(id); + } + } + } catch (Exception e) { + e.printStackTrace(); } } private void dismissRedPackageDialog() { - if (openDialogs != null) { - openDialogs.clear(); - } if (mCurrentFragment != null) { mCurrentFragment.dismissSendRedPackageDialog(); } @@ -1065,8 +1051,6 @@ public class AVRoomActivity extends BaseMvpActivity + if (item.state != 3 && item.state != 6 && item.state != 4) { + roomView?.getActivity().let { + RedPackageOpenDialog2.newInstance(item).show(it) + } + } + }, {}) + } + /** * 监听房间信令 */ @@ -48,7 +63,7 @@ class RedPackageHandler : RoomHandler() { (it.chatRoomMessage.attachment as RedPackageAttachment).getRedPackageNotifyInfo() } .subscribe { data: RedPackageNotifyInfo -> - handleRoomRedPackage(data) + handleRoomRedPackage(data, true) } } @@ -63,39 +78,48 @@ class RedPackageHandler : RoomHandler() { .compose(bindToLifecycle()) .subscribe({ data -> logD("requestLatestRoomRedPackage() data:$data") - handleRoomRedPackage(data) - }, { - - }) + handleRoomRedPackage(data, false) + }, {}) } /** * 处理厅内红包,非全服红包 + * @param isSignaling 是否来自信令? */ - private fun handleRoomRedPackage(data: RedPackageNotifyInfo) { - if (data.kind == 0 || (data.kind == 1 && data.validityType == 0)) { - //【旧版本-厅内红包:kind=0】、【新版本-厅内无门槛-立即生效红包:kind=1&validityType=0】 - tryShowOpenDialog(data) - } + private fun handleRoomRedPackage(data: RedPackageNotifyInfo, isSignaling: Boolean) { + tryShowOpenDialog(data, isSignaling) updateIcon(data) } /** * 更新红包入口图标 */ - private fun updateIcon(data: RedPackageNotifyInfo) { + private fun updateIcon(data: RedPackageNotifyInfo?) { iconLiveData.postValue(data) } /** * 尝试展示红包领取弹窗 */ - private fun tryShowOpenDialog(data: RedPackageNotifyInfo) { + private fun tryShowOpenDialog(data: RedPackageNotifyInfo, isSignaling: Boolean) { val activity = roomView?.getActivity() ?: return if (activity.isFinishing) { return } - logD("tryShowOpenDialog() data:$data") - RedPackageOpenDialog2().show(activity) + if (!isSignaling) { + return + } + if (data.kind == 0 || (data.kind == 1 && data.validityType == 0)) { + //【旧版本-厅内红包:kind=0】、【新版本-厅内无门槛-立即生效红包:kind=1&validityType=0】 + RedPackageOpenDialog2.newInstance(data).show(activity) + } + } + + /** + * 请求刷新Icon(数据已过期) + */ + fun requestRefreshIcon() { + updateIcon(null) + requestLatestRoomRedPackage() } } \ No newline at end of file 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 46fd829da..87c177603 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 @@ -38,6 +38,9 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { private var numView: TextView? = null private var countDownDisposable: Disposable? = null private var data: RedPackageNotifyInfo? = null + private val redPackageHandler: RedPackageHandler? + get() = RoomContext.get() + ?.findAbility(RedPackageHandler::class.java.simpleName) // 临时这样实现,后续优化进度弹窗 private var dialogManager: DialogManager? = null @@ -150,11 +153,8 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { } private fun init(roomView: RoomView) { - val context = roomView.getRoomContext() val lifecycleOwner = roomView.getLifecycleOwner() - val handler = - context?.findAbility(RedPackageHandler::class.java.simpleName) - handler?.iconLiveData?.observe(lifecycleOwner) { + redPackageHandler?.iconLiveData?.observe(lifecycleOwner) { loadData(it) } } @@ -202,8 +202,22 @@ class RedPackageWidget : ConstraintLayout, RoomWidget { val disposable = RedPackageModel.getRedPackage(data.redEnvelopeId.toLongOrDefault(0)) .subscribe({ item -> dialogManager?.dismissDialog() - roomView?.getActivity().let { - RedPackageOpenDialog2.newInstance(item).show(it) + when (item.state) { + 3 -> { + redPackageHandler?.requestRefreshIcon() + SingleToastUtil.showToast(R.string.red_package_result_empty_tips) + } + + 6 -> { + redPackageHandler?.requestRefreshIcon() + SingleToastUtil.showToast(R.string.red_package_disabled_tips) + } + + else -> { + roomView?.getActivity().let { + RedPackageOpenDialog2.newInstance(item).show(it) + } + } } }, { SingleToastUtil.showToast(it.message) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageOpenDialog2.kt b/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageOpenDialog2.kt index ae96ff2f6..296350806 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageOpenDialog2.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageOpenDialog2.kt @@ -76,6 +76,43 @@ class RedPackageOpenDialog2 : BaseDialog() { private var opening = false companion object { + /** + * 此入口来源仅限:【全服红包信令】、【厅内无门槛-立即生效红包信令】 + */ + fun newInstance(data: RedPackageNotifyInfo): RedPackageOpenDialog2 { + /** + * 收到这两种信令直接展示即可,无需再次请求接口查询状态, + * 但由于信令和接口查询的数据格式不一致,所以这里做下转换,达到逻辑共用 + */ + val item = RedPackageData( + amount = null, + avatar = data.sendUserAvatar, + beginTime = data.beginTime, + commissionAmount = null, + createTime = null, + duration = null, + endTime = null, + finish = true, + id = data.redEnvelopeId.toLongOrNull(), + kind = data.kind, + message = data.redEnvelopeMessage, + nick = data.sendUserNick, + num = null, + originalAmount = null, + position = null, + roomTitle = null, + roomUid = data.roomUid, + //红包状态 1 开抢中 2 过时 3 抢光了 4 抢到了 5 将要开始 6 超时已退还 + state = null, + type = null, + updateTime = null, + userId = null, + validityType = data.validityType, + result = null + ) + return newInstance(item) + } + fun newInstance(data: RedPackageData): RedPackageOpenDialog2 { return RedPackageOpenDialog2().apply { arguments = Bundle().apply { @@ -106,10 +143,6 @@ class RedPackageOpenDialog2 : BaseDialog() { binding.layoutBtn.singleClick { btnRunnable?.invoke() } - - binding.ivSendAvatar.singleClick { - showUserDialog(data.userId) - } loadData(data) } @@ -117,7 +150,19 @@ class RedPackageOpenDialog2 : BaseDialog() { * 加载红包数据 */ private fun loadData(data: RedPackageData) { - // 默认不可见先 + //红包状态 1 开抢中 2 过时 3 抢光了 4 抢到了 5 将要开始 6 超时已退还 + if (data.state == 4) { + loadResult(data.result) + } else { + // else简单理解为可领取状态,正常情况下在RedPackageWidget点击时有异常状态过滤 + loadOpen(data) + } + } + + /** + * 加载可领取数据 + */ + private fun loadOpen(data: RedPackageData) { binding.groupOpen.isVisible = true binding.groupResult.isVisible = false binding.ivSendAvatar.loadAvatar(data.avatar) @@ -300,66 +345,70 @@ class RedPackageOpenDialog2 : BaseDialog() { opening = true openResultRunnable = null startRedPacketAnim(binding.layoutBtn) - RedPackageModel.openRedPackage(data.id ?: 0) + val d = RedPackageModel.openRedPackage(data.id ?: 0) .compose(bindUntilEvent(FragmentEvent.DESTROY_VIEW)).subscribe({ if (isValidOfBtnAnimator) { btnAnimator?.cancel() - openSuccess(it) + onOpenSuccess(it) } else { openResultRunnable = { - openSuccess(it) + onOpenSuccess(it) } } }, { if (isValidOfBtnAnimator) { btnAnimator?.cancel() - openFail(it) + onOpenFail(it) } else { openResultRunnable = { - openFail(it) + onOpenFail(it) } } }) } /** - * 打开红包响应成功 - * @param data 结果 + * 加载结果 */ - private fun openSuccess(data: RedPackageInfo) { + private fun loadResult(data: RedPackageInfo?) { binding.layoutContent.setBackgroundResource(R.drawable.red_package_result_bg) binding.groupOpen.isVisible = false binding.groupResult.isVisible = true + binding.groupResultMoney.isVisible = false binding.tvResultEmptyTips.isVisible = false - binding.ivResultSendAvatar.singleClick { - showUserDialog(data.redEnvelopeVO?.userVO?.uid) - } - binding.ivResultSendAvatar.loadAvatar(data.redEnvelopeVO?.userVO?.avatar) - binding.tvResultSendName.text = data.redEnvelopeVO?.userVO?.nick ?: "" - val name = data.redEnvelopeVO?.userVO?.nick ?: "" - binding.tvResultSendName.text = name.take(8) + "..的紅包" - binding.tvMessage.text = data.redEnvelopeVO?.message + binding.ivResultSendAvatar.loadAvatar(data?.redEnvelopeVO?.userVO?.avatar) + binding.tvResultSendName.text = data?.redEnvelopeVO?.userVO?.nick ?: "" + val name = data?.redEnvelopeVO?.userVO?.nick ?: "" + binding.tvResultSendName.text = name?.take(8) + "..的紅包" + binding.tvMessage.text = data?.redEnvelopeVO?.message binding.tvCount.text = R.string.red_package_result_count_format.toStringRes() - .format(data.redEnvelopeVO?.pickNum ?: 0, data.redEnvelopeVO?.totalNum ?: 0) + .format(data?.redEnvelopeVO?.pickNum ?: 0, data?.redEnvelopeVO?.totalNum ?: 0) val adapter = RedPackageResultAdapter() - adapter.setOnItemChildClickListener { _, view, position -> - if (view.id == R.id.iv_avatar) { - adapter.data.getOrNull(position)?.let { - showUserDialog(it.userVO.uid) - } - } - } binding.recyclerView.adapter = adapter - adapter.setNewData(data.redEnvelopeItemVOs) - PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe() + adapter.setNewData(data?.redEnvelopeItemVOs) - when (data.redEnvelopeState) { + when (data?.redEnvelopeState) { RedEnvelopeState.SUCCESS -> { binding.tvMoney.text = data.currentUserAmount.toString().substringBefore(".") binding.groupResultMoney.isVisible = true + } - // 下面是延续老代码保留的 + RedEnvelopeState.TIME_OUT, RedEnvelopeState.REMAIN_ZERO, RedEnvelopeState.TIME_OUT_BACK -> { + binding.tvResultEmptyTips.isVisible = true + } + } + } + + /** + * 打开红包响应成功 + * @param data 结果 + */ + private fun onOpenSuccess(data: RedPackageInfo) { + loadResult(data) + when (data.redEnvelopeState) { + RedEnvelopeState.SUCCESS -> { + // 下面这段是延续老代码保留的 if (!AvRoomDataManager.get().isRoomFans) { AvRoomDataManager.get().roomUid.let { CollectionRoomModel.get().followRoom("1", it) @@ -370,19 +419,15 @@ class RedPackageOpenDialog2 : BaseDialog() { } } } - - RedEnvelopeState.TIME_OUT, RedEnvelopeState.REMAIN_ZERO, RedEnvelopeState.TIME_OUT_BACK -> { - binding.groupResultMoney.isVisible = false - binding.tvResultEmptyTips.isVisible = true - } } + PayModel.get().getWalletInfo(AuthModel.get().currentUid).subscribe() opening = false } /** * 打开红包响应失败 */ - private fun openFail(throwable: Throwable) { + private fun onOpenFail(throwable: Throwable) { switchToOpenState() btnAnimator?.cancel() SingleToastUtil.showToast(throwable.message) diff --git a/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageResultAdapter.kt b/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageResultAdapter.kt index 49aef987e..a7b5b585c 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageResultAdapter.kt +++ b/app/src/main/java/com/yizhuan/erban/avroom/redpackage/open/RedPackageResultAdapter.kt @@ -26,12 +26,6 @@ class RedPackageResultAdapter : Locale.CHINA ) - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { - return super.onCreateViewHolder(parent, viewType).apply { - this.addOnClickListener(R.id.iv_avatar) - } - } - override fun convert(helper: BaseViewHolder, item: RedEnvelopeItemVO) { helper.getView(R.id.iv_avatar).loadAvatar(item.userVO.avatar) val isSelf = item.userVO.uid == UserUtils.getUserUid() diff --git a/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java b/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java index f12bf2f7b..156b0f724 100644 --- a/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java +++ b/app/src/main/java/com/yizhuan/erban/base/BaseActivity.java @@ -70,6 +70,7 @@ import com.yizhuan.erban.avroom.activity.AVRoomActivity; import com.yizhuan.erban.avroom.firstcharge.FirstChargeDialog; import com.yizhuan.erban.avroom.redpackage.RedPackageGoRoomDialog; import com.yizhuan.erban.avroom.redpackage.RedPackageOpenDialog; +import com.yizhuan.erban.avroom.redpackage.open.RedPackageOpenDialog2; import com.yizhuan.erban.common.LoadingFragment; import com.yizhuan.erban.common.NetworkErrorFragment; import com.yizhuan.erban.common.NoDataFragment; @@ -958,7 +959,7 @@ public abstract class BaseActivity extends RxAppCompatActivity RedPackageNotifyInfo notifyInfo = new Gson().fromJson(String.valueOf(baseProtocol.getData()), RedPackageNotifyInfo.class); RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo; if (roomInfo != null && roomInfo.getUid() == notifyInfo.getRoomUid() && context instanceof AVRoomActivity) { - RedPackageOpenDialog.Companion.newInstance(notifyInfo).show(BaseActivity.this); + RedPackageOpenDialog2.Companion.newInstance(notifyInfo).show(BaseActivity.this); } else { RedPackageGoRoomDialog.Companion.newInstance(notifyInfo).show(this); } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 945d2c15e..d284f457c 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -5180,6 +5180,7 @@ 發送彈幕 可搶紅包 搶完了,下次早點來哦~ - + 該紅包已失效 + ” \ No newline at end of file diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/redpackage/RedPackageData.kt b/core/src/main/java/com/yizhuan/xchat_android_core/redpackage/RedPackageData.kt index 0679ce41d..7578ece37 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/redpackage/RedPackageData.kt +++ b/core/src/main/java/com/yizhuan/xchat_android_core/redpackage/RedPackageData.kt @@ -30,5 +30,7 @@ data class RedPackageData( val type: String?, val updateTime: Long?, val userId: Long?, - val validityType: Int? + val validityType: Int?, + // 结果 + val result: RedPackageInfo? ) : Serializable \ No newline at end of file