feat:完成送礼后的解锁礼物本地状态更新逻辑

This commit is contained in:
Max
2024-01-29 11:51:46 +08:00
parent f212af49f1
commit 44ad80c708
8 changed files with 178 additions and 46 deletions

View File

@@ -29,6 +29,8 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
public final ObservableField<String> countText = new ObservableField<>();
public final ObservableBoolean isLocked = new ObservableBoolean();
public Drawable nobleDrawable;
public Drawable radishDrawable;
@@ -55,8 +57,6 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
*/
public boolean isExclusive;
public boolean isLocked;
public String vipIcon;
public boolean isPrivateChat;
@@ -89,15 +89,8 @@ public class GiftInfoVm extends BaseItem<GiftInfo> {
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<GiftInfo> {
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;
}
}

View File

@@ -61,4 +61,8 @@ class GIftDialogUnlockPanel : CardView {
recyclerView?.smoothScrollToPosition(index)
}
}
fun refreshState() {
adapter.notifyItemRangeChanged(0, adapter.itemCount, true)
}
}

View File

@@ -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,12 +915,15 @@ 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();
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<MicMemberInfo> 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<GiftInfo> 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<GiftInfoVm> page : pagerList) {
for (GiftInfoVm item : page) {
GiftInfo itemBaseGift = item.data.getBaseGift();
if (itemBaseGift != null && itemBaseGift.getGiftId() == giftId) {
item.refreshUnlockState();
}
}
}
}

View File

@@ -31,6 +31,17 @@ class GiftUnLockInfoAdapter(list: List<UnlockItem>) :
addItemType(UnlockItem.ITEM_TYPE_CHILD, R.layout.gift_dialog_lock_item_child)
}
override fun convertPayloads(
helper: BaseViewHolder,
item: UnlockItem?,
payloads: MutableList<Any>
) {
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>) :
unlockItem = item
}
val total = unlockItem?.condition ?: 0
val progress = (unlockItem?.process ?: 0).coerceAtMost(total)
helper.getView<ImageView>(R.id.iv_cover).load(giftInfo?.giftUrl)
val nameView = helper.getView<TextView>(R.id.tv_name)
SpannableTextBuilder(nameView)
@@ -72,6 +82,18 @@ class GiftUnLockInfoAdapter(list: List<UnlockItem>) :
textColor = nameView.context.getColorById(R.color.color_FFDA24)
)
.appendText("${baseGiftName ?: ""}可解锁").apply()
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<ProgressBar>(R.id.progress_bar)
progressBar.max = total
progressBar.progress = progress
@@ -90,8 +112,6 @@ class GiftUnLockInfoAdapter(list: List<UnlockItem>) :
helper.setAlpha(R.id.tv_count, alpha)
helper.setAlpha(R.id.progress_bar, alpha)
}
}
}
fun setNewData(baseGiftInfo: GiftInfo?, data: MutableList<UnlockItem>?) {
this.baseGiftName = baseGiftInfo?.giftName

View File

@@ -81,7 +81,7 @@ public class GiftIndicator extends LinearLayout {
public static final int TYPE_PRIVILEGE = 8;
/**
* 趣味
* 趣味(福袋礼物、解锁礼物、装扮礼物)
*/
public static final int TYPE_INTEREST = 9;

View File

@@ -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;
}

View File

@@ -111,6 +111,30 @@ public class GiftInfo implements Serializable {
this.unlocked = unlocked;
}
/**
* 更新解锁进度
*/
public void updateUnlockProgress(int addNumber) {
List<UnLockGiftInfo> 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);
}
}
}
}
//<editor-fold defaultstate="collapsed" desc="delombok">
@SuppressWarnings("all")
public GiftInfo() {

View File

@@ -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
}
}
}