From 44ad80c708b46a6b84eaf72e3009614254422f20 Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 29 Jan 2024 11:51:46 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=8C=E6=88=90=E9=80=81=E7=A4=BC?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E8=A7=A3=E9=94=81=E7=A4=BC=E7=89=A9=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0=E7=8A=B6=E6=80=81=E6=9B=B4=E6=96=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/gift/dialog/GiftInfoVm.java | 29 ++++-- .../app/ui/widget/GIftDialogUnlockPanel.kt | 4 + .../com/nnbc123/app/ui/widget/GiftDialog.java | 96 ++++++++++++++++--- .../app/ui/widget/GiftUnLockInfoAdapter.kt | 56 +++++++---- .../widget/magicindicator/GiftIndicator.java | 2 +- .../java/com/nnbc123/core/gift/GiftModel.java | 1 + .../com/nnbc123/core/gift/bean/GiftInfo.java | 24 +++++ .../nnbc123/core/gift/bean/UnLockGiftInfo.kt | 12 ++- 8 files changed, 178 insertions(+), 46 deletions(-) diff --git a/app/src/main/java/com/nnbc123/app/ui/gift/dialog/GiftInfoVm.java b/app/src/main/java/com/nnbc123/app/ui/gift/dialog/GiftInfoVm.java index 2cab09f7c..885c3ed83 100644 --- a/app/src/main/java/com/nnbc123/app/ui/gift/dialog/GiftInfoVm.java +++ b/app/src/main/java/com/nnbc123/app/ui/gift/dialog/GiftInfoVm.java @@ -29,6 +29,8 @@ public class GiftInfoVm extends BaseItem { public final ObservableField countText = new ObservableField<>(); + public final ObservableBoolean isLocked = new ObservableBoolean(); + public Drawable nobleDrawable; public Drawable radishDrawable; @@ -55,8 +57,6 @@ public class GiftInfoVm extends BaseItem { */ public boolean isExclusive; - public boolean isLocked; - public String vipIcon; public boolean isPrivateChat; @@ -89,15 +89,8 @@ public class GiftInfoVm extends BaseItem { isShowEffect = data.isHasEffect(); isExclusive = data.isRoomExclude(); SimpleVipInfo vipInfo = data.getGiftVipInfo(); - isLocked = vipInfo != null && VipHelper.getMyVipLevel() < vipInfo.getVipLevel(); vipIcon = vipInfo == null ? "" : vipInfo.getVipIcon(); - if (!isLocked) { - if (data.getGiftType() == GiftType.GIFT_TYPE_UNLOCK) { - if (!data.isUnlocked()) { - isLocked = true; - } - } - } + isLocked.set(getIsLocked()); } @Override @@ -114,4 +107,20 @@ public class GiftInfoVm extends BaseItem { this.countText.set("x" + data.getCount()); } + public void refreshUnlockState() { + isLocked.set(getIsLocked()); + } + + private boolean getIsLocked() { + SimpleVipInfo vipInfo = data.getGiftVipInfo(); + boolean isLocked = vipInfo != null && VipHelper.getMyVipLevel() < vipInfo.getVipLevel(); + if (!isLocked) { + if (data.getGiftType() == GiftType.GIFT_TYPE_UNLOCK) { + if (!data.isUnlocked()) { + isLocked = true; + } + } + } + return isLocked; + } } diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/GIftDialogUnlockPanel.kt b/app/src/main/java/com/nnbc123/app/ui/widget/GIftDialogUnlockPanel.kt index 05ba6ea70..5c5e9f8a0 100644 --- a/app/src/main/java/com/nnbc123/app/ui/widget/GIftDialogUnlockPanel.kt +++ b/app/src/main/java/com/nnbc123/app/ui/widget/GIftDialogUnlockPanel.kt @@ -61,4 +61,8 @@ class GIftDialogUnlockPanel : CardView { recyclerView?.smoothScrollToPosition(index) } } + + fun refreshState() { + adapter.notifyItemRangeChanged(0, adapter.itemCount, true) + } } \ No newline at end of file diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java b/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java index bd09347a6..39bb349bc 100644 --- a/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java +++ b/app/src/main/java/com/nnbc123/app/ui/widget/GiftDialog.java @@ -75,6 +75,7 @@ import com.nnbc123.core.gift.bean.GiftPrivilegeInfo; import com.nnbc123.core.gift.bean.GiftTab; import com.nnbc123.core.gift.bean.GiftType; import com.nnbc123.core.gift.bean.LuckyBagNoticeInfo; +import com.nnbc123.core.gift.bean.UnLockGiftInfo; import com.nnbc123.core.gift.event.UpdateKnapEvent; import com.nnbc123.core.im.custom.bean.RoomReceivedLuckyGiftAttachment; import com.nnbc123.core.initial.InitialModel; @@ -216,7 +217,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene private AppCompatTextView tvNum; private SuperTextView tvPrivilegeGive; private Group groupPrivilege; - private GIftDialogUnlockPanel panelUnLock; + private GIftDialogUnlockPanel unLockPanel; private int mPrivilegePosition = 0; @@ -423,7 +424,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene ivDrawGiftRemoveLast = findViewById(R.id.iv_draw_gift_remove_last); ivDrawGiftRemoveAll = findViewById(R.id.iv_draw_gift_remove_all); ivDrawGiftClose = findViewById(R.id.iv_draw_gift_close); - panelUnLock = findViewById(R.id.panel_unlock); + unLockPanel = findViewById(R.id.panel_unlock); ivDrawGiftClose.setOnClickListener(this); ivDrawGiftRemoveLast.setOnClickListener(this); ivDrawGiftRemoveAll.setOnClickListener(this); @@ -880,7 +881,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene } private void updateUnLockTips() { - panelUnLock.update(currentGiftInfo); + unLockPanel.update(currentGiftInfo); } private void updateLuckyBagIntro() { @@ -914,11 +915,14 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene .flatMap(luckyBagNoticeInfos -> Observable.intervalRange(0, Integer.MAX_VALUE, 0, 5, TimeUnit.SECONDS)) .observeOn(AndroidSchedulers.mainThread()) .subscribe(aLong -> { - int index = aLong.intValue() % luckyMsgAdapter.getItemCount(); - if (index == 0) { - rvLuckyMsg.scrollToPosition(index); - } else { - rvLuckyMsg.smoothScrollToPosition(index); + int count = luckyMsgAdapter.getItemCount(); + if (count > 0) { + int index = aLong.intValue() % count; + if (index == 0) { + rvLuckyMsg.scrollToPosition(index); + } else { + rvLuckyMsg.smoothScrollToPosition(index); + } } }); } @@ -1333,10 +1337,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene micMemberInfo.setAccount(String.valueOf(uid)); targetUids.add(micMemberInfo); Log.e(TAG, "onClick: indicator type: " + giftIndicator.getCurrrentType()); + int number = giftNumber == -1 ? finalCurrentGiftInfo.getCount() : giftNumber; giftDialogBtnClickListener.onSendGiftBtnClick( finalCurrentGiftInfo, targetUids, - giftNumber == -1 ? finalCurrentGiftInfo.getCount() : giftNumber, + number, giftMessage, giftIndicator.getCurrrentType() == GiftIndicator.TYPE_KNAP, false, @@ -1344,7 +1349,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene new SenGiftCallback() { @Override public void onSuccess() { - onSendGiftSuccess(finalCurrentGiftInfo); + onSendGiftSuccess(finalCurrentGiftInfo, number, targetUids); } @Override @@ -1363,10 +1368,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene micMemberInfo.setAccount(String.valueOf(uid)); targetUids.add(micMemberInfo); Log.e(TAG, "onClick: indicator type: " + giftIndicator.getCurrrentType()); + int number = giftNumber == -1 ? finalCurrentGiftInfo.getCount() : giftNumber; giftDialogBtnClickListener.onSendGiftBtnClick( finalCurrentGiftInfo, targetUids, - giftNumber == -1 ? finalCurrentGiftInfo.getCount() : giftNumber, + number, giftMessage, giftIndicator.getCurrrentType() == GiftIndicator.TYPE_KNAP, false, @@ -1374,7 +1380,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene new SenGiftCallback() { @Override public void onSuccess() { - onSendGiftSuccess(finalCurrentGiftInfo); + onSendGiftSuccess(finalCurrentGiftInfo, number, targetUids); } @Override @@ -1395,10 +1401,11 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene sendGiftButton.setEnabled(true); return; } + int number = giftNumber == -1 ? finalCurrentGiftInfo.getCount() : giftNumber; giftDialogBtnClickListener.onSendGiftBtnClick( finalCurrentGiftInfo, selectedMembers, - giftNumber == -1 ? finalCurrentGiftInfo.getCount() : giftNumber, + number, giftMessage, giftIndicator.getCurrrentType() == GiftIndicator.TYPE_KNAP, avatarListAdapter.getSelectType() == GiftAvatarAdapter.SELECT_TYPE_WHOLE_MIC, @@ -1406,7 +1413,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene new SenGiftCallback() { @Override public void onSuccess() { - onSendGiftSuccess(finalCurrentGiftInfo); + onSendGiftSuccess(finalCurrentGiftInfo, number, selectedMembers); } @Override @@ -1557,7 +1564,7 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene updateGiftView(giftIndicator.getCurrrentType()); } - private void onSendGiftSuccess(GiftInfo giftInfo) { + private void onSendGiftSuccess(GiftInfo giftInfo, int giftNumber, List receiveUsers) { if (sendGiftButton == null) return; sendGiftButton.setText("赠送"); sendGiftButton.setEnabled(true); @@ -1565,6 +1572,65 @@ public class GiftDialog extends BottomSheetDialog implements View.OnClickListene SingleToastUtil.showToast("发送涂鸦礼物:" + giftInfo.getGiftName() + "成功"); clearDrawGift(); dismiss(); + } else if (giftInfo.getGiftType() == GiftType.GIFT_TYPE_UNLOCK) { + int totalNumber = 0; + if (receiveUsers != null) { + totalNumber = receiveUsers.size() * giftNumber; + } + updateUnlockStateSendSuccess(giftInfo, totalNumber); + } + } + + // 更新本地解锁礼物的数据状态(解锁状态、送出的数量) + private void updateUnlockStateSendSuccess(GiftInfo giftInfo, int totalNumber) { + if(giftInfo.getGiftType() != GiftType.GIFT_TYPE_UNLOCK){ + return; + } + GiftInfo baseGift = giftInfo.getBaseGift(); + if (baseGift == null || baseGift.getGiftId() != giftInfo.getGiftId()) { + // 不是基础礼物 + return; + } + // 先更新数据 + updateUnlockGiftDataState(giftInfo.getGiftId(), totalNumber); + // 后更新UI + updateUnlockGiftUiState(giftInfo.getGiftId()); + // 更新提示面板UI + unLockPanel.refreshState(); + } + + // 更新解锁礼物数据状态 + private void updateUnlockGiftDataState(int giftId, int number) { + List panelGiftList = GiftModel.get().getGiftInfoList(GiftType.GIFT_TYPE_UNLOCK); + if (panelGiftList == null) { + return; + } + for (GiftInfo item : panelGiftList) { + if (item.getGiftType() != GiftType.GIFT_TYPE_UNLOCK) { + continue; + } + if (item.getBaseGift() == null || item.getBaseGift().getGiftId() != giftId) { + continue; + } + item.updateUnlockProgress(number); + } + } + + // 更新解锁礼物Ui状态 + private void updateUnlockGiftUiState(int giftId) { + if (giftIndicator.getCurrrentType() != GiftIndicator.TYPE_INTEREST) { + return; + } + if (ListUtils.isListEmpty(pagerList)) { + return; + } + for (List page : pagerList) { + for (GiftInfoVm item : page) { + GiftInfo itemBaseGift = item.data.getBaseGift(); + if (itemBaseGift != null && itemBaseGift.getGiftId() == giftId) { + item.refreshUnlockState(); + } + } } } diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/GiftUnLockInfoAdapter.kt b/app/src/main/java/com/nnbc123/app/ui/widget/GiftUnLockInfoAdapter.kt index b9bb45ae3..c09b81fc0 100644 --- a/app/src/main/java/com/nnbc123/app/ui/widget/GiftUnLockInfoAdapter.kt +++ b/app/src/main/java/com/nnbc123/app/ui/widget/GiftUnLockInfoAdapter.kt @@ -31,6 +31,17 @@ class GiftUnLockInfoAdapter(list: List) : addItemType(UnlockItem.ITEM_TYPE_CHILD, R.layout.gift_dialog_lock_item_child) } + override fun convertPayloads( + helper: BaseViewHolder, + item: UnlockItem?, + payloads: MutableList + ) { + super.convertPayloads(helper, item, payloads) + if (item?.itemType == UnlockItem.ITEM_TYPE_CHILD) { + convertChildState(helper, item) + } + } + override fun convert(helper: BaseViewHolder, item: UnlockItem?) { val giftInfo = item?.getGiftData() when (item?.itemType) { @@ -62,7 +73,6 @@ class GiftUnLockInfoAdapter(list: List) : unlockItem = item } val total = unlockItem?.condition ?: 0 - val progress = (unlockItem?.process ?: 0).coerceAtMost(total) helper.getView(R.id.iv_cover).load(giftInfo?.giftUrl) val nameView = helper.getView(R.id.tv_name) SpannableTextBuilder(nameView) @@ -72,27 +82,37 @@ class GiftUnLockInfoAdapter(list: List) : textColor = nameView.context.getColorById(R.color.color_FFDA24) ) .appendText("${baseGiftName ?: ""}可解锁").apply() - val progressBar = helper.getView(R.id.progress_bar) - progressBar.max = total - progressBar.progress = progress - helper.setText(R.id.tv_count, "$progress/$total") - val lockIconView = helper.getView(R.id.iv_lock) - val alpha: Float - if (unlockItem?.unlocked == true) { - alpha = 1f - lockIconView.isVisible = false - } else { - alpha = 0.5f - lockIconView.isVisible = true - } - helper.setAlpha(R.id.tv_name, alpha) - helper.setAlpha(R.id.iv_cover, alpha) - helper.setAlpha(R.id.tv_count, alpha) - helper.setAlpha(R.id.progress_bar, alpha) + convertChildState(helper, item) } } } + private fun convertChildState(helper: BaseViewHolder, item: UnlockItem?) { + var unlockItem: UnLockGiftInfo? = null + if (item is UnLockGiftInfo) { + unlockItem = item + } + val total = unlockItem?.condition ?: 0 + val progress = (unlockItem?.process ?: 0).coerceAtMost(total) + val progressBar = helper.getView(R.id.progress_bar) + progressBar.max = total + progressBar.progress = progress + helper.setText(R.id.tv_count, "$progress/$total") + val lockIconView = helper.getView(R.id.iv_lock) + val alpha: Float + if (unlockItem?.unlocked == true) { + alpha = 1f + lockIconView.isVisible = false + } else { + alpha = 0.5f + lockIconView.isVisible = true + } + helper.setAlpha(R.id.tv_name, alpha) + helper.setAlpha(R.id.iv_cover, alpha) + helper.setAlpha(R.id.tv_count, alpha) + helper.setAlpha(R.id.progress_bar, alpha) + } + fun setNewData(baseGiftInfo: GiftInfo?, data: MutableList?) { this.baseGiftName = baseGiftInfo?.giftName super.setNewData(data) diff --git a/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/GiftIndicator.java b/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/GiftIndicator.java index 4394fb167..825da1d70 100644 --- a/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/GiftIndicator.java +++ b/app/src/main/java/com/nnbc123/app/ui/widget/magicindicator/GiftIndicator.java @@ -81,7 +81,7 @@ public class GiftIndicator extends LinearLayout { public static final int TYPE_PRIVILEGE = 8; /** - * 趣味 + * 趣味(福袋礼物、解锁礼物、装扮礼物) */ public static final int TYPE_INTEREST = 9; diff --git a/core/src/main/java/com/nnbc123/core/gift/GiftModel.java b/core/src/main/java/com/nnbc123/core/gift/GiftModel.java index 9cacda6e4..cc5d32c4b 100644 --- a/core/src/main/java/com/nnbc123/core/gift/GiftModel.java +++ b/core/src/main/java/com/nnbc123/core/gift/GiftModel.java @@ -237,6 +237,7 @@ public class GiftModel extends BaseModel implements IGiftModel { giftInfos = allGiftListInfo.getPenaltyGift(); break; case GiftType.GIFT_TYPE_INTEREST: + case GiftType.GIFT_TYPE_UNLOCK: giftInfos = allGiftListInfo.getInterestGift(); break; } diff --git a/core/src/main/java/com/nnbc123/core/gift/bean/GiftInfo.java b/core/src/main/java/com/nnbc123/core/gift/bean/GiftInfo.java index 3ea7ee0fe..d04ecfc91 100644 --- a/core/src/main/java/com/nnbc123/core/gift/bean/GiftInfo.java +++ b/core/src/main/java/com/nnbc123/core/gift/bean/GiftInfo.java @@ -111,6 +111,30 @@ public class GiftInfo implements Serializable { this.unlocked = unlocked; } + /** + * 更新解锁进度 + */ + public void updateUnlockProgress(int addNumber) { + List childGiftList = getUnlockGiftList(); + if (childGiftList == null) { + return; + } + for (int j = 0; j < childGiftList.size(); j++) { + UnLockGiftInfo childItem = childGiftList.get(j); + if (childItem == null) { + continue; + } + childItem.addProgress(addNumber); + GiftInfo childGiftInfo = childItem.getTargetGift(); + if (childGiftInfo != null && childGiftInfo.getGiftId() == getGiftId()) { + Boolean unlocked = childItem.getUnlocked(); + if (unlocked != null) { + this.setUnlocked(unlocked); + } + } + } + } + // @SuppressWarnings("all") public GiftInfo() { diff --git a/core/src/main/java/com/nnbc123/core/gift/bean/UnLockGiftInfo.kt b/core/src/main/java/com/nnbc123/core/gift/bean/UnLockGiftInfo.kt index 21b0a2306..26e936bdc 100644 --- a/core/src/main/java/com/nnbc123/core/gift/bean/UnLockGiftInfo.kt +++ b/core/src/main/java/com/nnbc123/core/gift/bean/UnLockGiftInfo.kt @@ -8,8 +8,8 @@ package com.nnbc123.core.gift.bean data class UnLockGiftInfo( val targetGift: GiftInfo? = null, val condition: Int? = null, - val process: Int? = null, - val unlocked: Boolean? = null + var process: Int? = null, + var unlocked: Boolean? = null ) : UnlockItem { override fun getGiftData(): GiftInfo? { return targetGift @@ -19,5 +19,13 @@ data class UnLockGiftInfo( return UnlockItem.ITEM_TYPE_CHILD } + // 加进度(发送基础礼物成功后:数量累加) + fun addProgress(count: Int) { + val p = process ?: 0 + process = p + count + if ((process ?: 0) >= (condition ?: 0)) { + unlocked = true + } + } } \ No newline at end of file