diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 486ccfaa7..8781a882c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -969,6 +969,14 @@
android:exported="false"
android:screenOrientation="portrait" />
+
+
+
+
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 79ba72bfc..6378581e3 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
@@ -93,6 +93,7 @@ import com.yizhuan.xchat_android_core.gift.bean.LuckyBagNoticeInfo;
import com.yizhuan.xchat_android_core.im.custom.bean.RoomPKAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.RoomPkBean;
import com.yizhuan.xchat_android_core.im.custom.bean.RoomReceivedLuckyGiftAttachment;
+import com.yizhuan.xchat_android_core.initial.InitialModel;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RoomEvent;
@@ -418,6 +419,7 @@ public class AVRoomActivity extends BaseMvpActivity()
.setPageSize(pageSize)
- .setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.avroom_anotherroompk_roompksearchactivity_01)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.avroom_anotherroompk_roompksearchactivity_01)))
.setLayoutManager(LinearLayoutManager(this))
.setRecyclerView(binding.recyclerView)
.setAdapter(roomPKSearchAdapter)
diff --git a/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java b/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java
index 45db6856a..3a728c977 100644
--- a/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java
+++ b/app/src/main/java/com/yizhuan/erban/avroom/presenter/HomePartyPresenter.java
@@ -55,12 +55,12 @@ public class HomePartyPresenter extends BaseRoomPresenter {
private boolean isLeaveMode = false;
/**
- * 上麦
+ * 上麥
*
* @param micPosition
* @param uId
- * @param isInviteUpMic 是否是主动的,false:主动
- * @param isReconnect 是否需要清除礼物值,普通情况下上麦传false,断网重连传ture
+ * @param isInviteUpMic 是否是主動的,false:主動
+ * @param isReconnect 是否需要清除禮物值,普通情況下上麥傳false,斷網重連傳ture
*/
public void upMicroPhone(final int micPosition, final String uId, boolean isInviteUpMic, boolean isReconnect) {
final RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
@@ -89,7 +89,7 @@ public class HomePartyPresenter extends BaseRoomPresenter {
upMicroPhone(micPosition, uId, isInviteUpMic, roomInfo, false);
}
- //isGiven上次是否异常退出
+ //isGiven上次是否異常退出
public void sendDragonBar(FaceInfo faceInfo, String point, boolean isGiven) {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo == null) return;
@@ -150,7 +150,7 @@ public class HomePartyPresenter extends BaseRoomPresenter {
faceReceiveInfo.setResultIndexes(integers);
faceReceiveInfos.add(faceReceiveInfo);
- // 发送云信信息给所有人
+ // 發送雲信信息給所有人
FaceAttachment faceAttachment =
new FaceAttachment(CustomAttachment.CUSTOM_MSG_DRAGON_BAR, second);
faceAttachment.setUid(userInfo.getUid());
@@ -159,7 +159,7 @@ public class HomePartyPresenter extends BaseRoomPresenter {
return ChatRoomMessageBuilder.createChatRoomCustomMessage(
// 聊天室id
roomInfo.getRoomId() + "",
- // 自定义消息
+ // 自定義消息
faceAttachment
);
}
@@ -178,13 +178,13 @@ public class HomePartyPresenter extends BaseRoomPresenter {
if (chatRoomMessage != null) {
if (chatRoomMessage.getMsgType() == MsgTypeEnum.custom) {
CustomAttachment attachment = (CustomAttachment) chatRoomMessage.getAttachment();
- // 显示表情在对应的位置
+ // 顯示錶情在對應的位置
if (attachment.getFirst() == CustomAttachment.CUSTOM_MSG_DRAGON_BAR) {
FaceAttachment faceAttachment = (FaceAttachment) attachment;
List faceReceiveInfos = faceAttachment.getFaceReceiveInfos();
if (faceReceiveInfos != null && faceReceiveInfos.size() > 0) {
- // 显示动画
+ // 显示動畫
IMNetEaseManager.get().getChatRoomEventObservable()
.onNext(new RoomEvent().setEvent(RoomEvent.DRAGON_BAR_SELF_START).setChatRoomMessage(chatRoomMessage));
}
@@ -215,16 +215,16 @@ public class HomePartyPresenter extends BaseRoomPresenter {
/**
- * 本地更新房主位信息或者关闭离线模式
+ * 本地更新房主位信息或者關閉離線模式
*/
@SuppressWarnings("CheckResult")
public void leaveModeCheck() {
- isLeaveMode = AvRoomDataManager.get().isLeaveMode(); // 进房缓存离线模式状态
+ isLeaveMode = AvRoomDataManager.get().isLeaveMode(); // 進房緩存離線模式狀態
if (!AvRoomDataManager.get().isCpRoom() && !AvRoomDataManager.get().isOpenKTV()) {
RoomQueueInfo queueInfo = AvRoomDataManager.get().getRoomQueueMemberInfoByMicPosition(-1);
- // 新版管理员首次进房,如果房主位有人,并且房间是离开模式,需要调用接口关闭离开模式(提高关闭离开模式的几率)
+ // 新版管理員首次進房,如果房主位有人,並且房間是離開模式,需要調用接口關閉離開模式(提高關閉離開模式的幾率)
if (AvRoomDataManager.get().isManager()) {
if (queueInfo != null) {
@@ -245,7 +245,7 @@ public class HomePartyPresenter extends BaseRoomPresenter {
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
int position = AvRoomDataManager.get().getMicPosition(AvRoomDataManager.get().getRoomUid());
if (roomInfo != null && roomInfo.isLeaveMode() && micPosition == position) {
- // 新版由管理员和房主位上麦用户共同调接口关闭离开模式(提高关闭离开模式成功率,降低接口调用频率);
+ // 新版由管理員和房主位上麥用戶共同調接口關閉離開模式(提高關閉離開模式成功率,降低接口調用頻率);
if (AvRoomDataManager.get().isManager() || String.valueOf(AuthModel.get().getCurrentUid()).equals(account)) {
new RoomSettingModel().leaveModeClose(roomInfo.getUid()).subscribe(new BeanObserver() {
@Override
@@ -273,7 +273,7 @@ public class HomePartyPresenter extends BaseRoomPresenter {
isLeaveMode = AvRoomDataManager.get().isLeaveMode();
- if (!isLeaveMode && AvRoomDataManager.get().isShowGiftValue()) // 礼物值模式下关闭离开模式,本地清除礼物值
+ if (!isLeaveMode && AvRoomDataManager.get().isShowGiftValue()) // 禮物值模式下關閉離開模式,本地清除禮物值
GiftValueMrg.get().handleDownMic(-1, String.valueOf(AvRoomDataManager.get().getRoomUid()));
}
@@ -328,6 +328,11 @@ public class HomePartyPresenter extends BaseRoomPresenter {
getMvpView().onShowBanner(bannerInfos);
}, throwable -> getMvpView().onShowBanner(bannerInfos));
} else {
+ if(GoldBoxHelper.isShowFairy()){
+ BannerInfo bannerInfo = new BannerInfo();
+ bannerInfo.setFairy(true);
+ bannerInfos.add(0, bannerInfo);
+ }
if (firstCharge) {
BannerInfo bannerInfo = new BannerInfo();
bannerInfo.setFirstCharge(true);
diff --git a/app/src/main/java/com/yizhuan/erban/avroom/presenter/SingleRoomPresenter.java b/app/src/main/java/com/yizhuan/erban/avroom/presenter/SingleRoomPresenter.java
index eb9cdae62..22ee2fa02 100644
--- a/app/src/main/java/com/yizhuan/erban/avroom/presenter/SingleRoomPresenter.java
+++ b/app/src/main/java/com/yizhuan/erban/avroom/presenter/SingleRoomPresenter.java
@@ -45,6 +45,11 @@ public class SingleRoomPresenter extends BaseRoomPresenter {
getMvpView().onShowBanner(bannerInfos);
}, throwable -> getMvpView().onShowBanner(bannerInfos));
} else {
+ if(GoldBoxHelper.isShowFairy()){
+ BannerInfo bannerInfo = new BannerInfo();
+ bannerInfo.setFairy(true);
+ bannerInfos.add(0, bannerInfo);
+ }
if (firstCharge) {
BannerInfo bannerInfo = new BannerInfo();
bannerInfo.setFirstCharge(true);
diff --git a/app/src/main/java/com/yizhuan/erban/avroom/singleroompk/SingleRoomPKSearchActivity.kt b/app/src/main/java/com/yizhuan/erban/avroom/singleroompk/SingleRoomPKSearchActivity.kt
index 6dcd511ac..17a4a5b46 100644
--- a/app/src/main/java/com/yizhuan/erban/avroom/singleroompk/SingleRoomPKSearchActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/avroom/singleroompk/SingleRoomPKSearchActivity.kt
@@ -46,7 +46,7 @@ class SingleRoomPKSearchActivity : BaseViewBindingActivity()
.setPageSize(pageSize)
- .setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.avroom_singleroompk_singleroompksearchactivity_01)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.avroom_singleroompk_singleroompksearchactivity_01)))
.setLayoutManager(LinearLayoutManager(this))
.setRecyclerView(binding.recyclerView)
.setAdapter(roomPKSearchAdapter)
diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java
index ef29f91ba..a22a9a58e 100644
--- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java
+++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MessageView.java
@@ -1,8 +1,20 @@
package com.yizhuan.erban.avroom.widget;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_FAIRY;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GIFT_COMPOUND;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_RED_PACKAGE;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_BOX_ME;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CONVERT_L1;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CONVERT_L2;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CONVERT_L3;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_BALL_L1;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_BALL_L2;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_BALL_L3;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L1;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L2;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L3;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L4;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_DRAW_GIFT_L5;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_FANS_TEAM_JOIN;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_GIFT_COMPOUND;
import static com.yizhuan.xchat_android_core.redpackage.RedPackageTypeKt.ALL_DIAMOND;
@@ -59,6 +71,8 @@ import com.yizhuan.erban.common.util.Utils;
import com.yizhuan.erban.common.widget.CustomAutoWidthImageSpan;
import com.yizhuan.erban.common.widget.CustomImageSpan;
import com.yizhuan.erban.common.widget.OriginalDrawStatusClickSpan;
+import com.yizhuan.erban.treasure_box.widget.GoldBoxHelper;
+import com.yizhuan.erban.treasurefairy.HomeFairyActivity;
import com.yizhuan.erban.ui.utils.ImageLoadUtils;
import com.yizhuan.erban.ui.widget.DividerItemDecoration;
import com.yizhuan.erban.ui.widget.MyItemAnimator;
@@ -88,6 +102,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.CleanScreenAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.DatingAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.FaceAttachment;
+import com.yizhuan.xchat_android_core.im.custom.bean.FairyMsgAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.FansTeamMsgAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.GiftAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.GiftBatchAttachment;
@@ -132,6 +147,7 @@ import com.yizhuan.xchat_android_core.noble.NobleInfo;
import com.yizhuan.xchat_android_core.noble.NobleUtil;
import com.yizhuan.xchat_android_core.praise.PraiseModel;
import com.yizhuan.xchat_android_core.redpackage.RedEnvelopeRoomMsg;
+import com.yizhuan.xchat_android_core.room.anotherroompk.ShowUserInfoDialogEvent;
import com.yizhuan.xchat_android_core.room.bean.DatingNotifyInfo;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.bean.RoomMessageViewNoticeInfo;
@@ -148,13 +164,15 @@ import com.yizhuan.xchat_android_core.room.queuing_mic.attachment.QueuingMicAtta
import com.yizhuan.xchat_android_core.room.queuing_mic.bean.QueuingMicInfo;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
+import com.yizhuan.xchat_android_core.treasurefairy.FairyMsgInfo;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.utils.ExtensionUtil;
-import com.yizhuan.xchat_android_core.utils.Logger;
+import com.yizhuan.xchat_android_core.utils.StringExtensionKt;
import com.yizhuan.xchat_android_core.utils.net.DontWarnObserver;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_core.vip.VipMessageInfo;
+import com.yizhuan.xchat_android_library.rxbus.RxBus;
import com.yizhuan.xchat_android_library.utils.FormatUtils;
import com.yizhuan.xchat_android_library.utils.JavaUtil;
import com.yizhuan.xchat_android_library.utils.ListUtils;
@@ -977,6 +995,8 @@ public class MessageView extends FrameLayout {
setLuckyGiftServerNotifyMsg(chatRoomMessage, tvContent);
} else if (first == CUSTOM_MSG_GIFT_COMPOUND) {
setGiftCompoundMsg(chatRoomMessage, tvContent);
+ } else if (first == CUSTOM_MSG_FAIRY) {
+ setFairyMsg(chatRoomMessage, tvContent);
} else {
tvContent.setTextColor(Color.WHITE);
tvContent.setText(tvContent.getResources().getText(R.string.not_support_message_tip));
@@ -990,6 +1010,87 @@ public class MessageView extends FrameLayout {
}
}
+ private void setFairyMsg(ChatRoomMessage chatRoomMessage, TextView tvContent) {
+ if (chatRoomMessage.getAttachment() instanceof FairyMsgAttachment) {
+ FairyMsgAttachment attachment = (FairyMsgAttachment) chatRoomMessage.getAttachment();
+ FairyMsgInfo fairyMsgInfo = attachment.getFairyMsgInfo();
+ if (fairyMsgInfo == null) return;
+ SpannableBuilder builder = null;
+ switch (attachment.getSecond()) {
+ case CUSTOM_MSG_SUB_DRAW_GIFT_L1:
+ case CUSTOM_MSG_SUB_DRAW_GIFT_L2:
+ case CUSTOM_MSG_SUB_DRAW_BALL_L1:
+ builder = builderDrawMsg(tvContent, fairyMsgInfo, "厲害了!");
+ break;
+ case CUSTOM_MSG_SUB_DRAW_GIFT_L3:
+ case CUSTOM_MSG_SUB_DRAW_GIFT_L4:
+ case CUSTOM_MSG_SUB_DRAW_GIFT_L5:
+ case CUSTOM_MSG_SUB_DRAW_BALL_L2:
+ case CUSTOM_MSG_SUB_DRAW_BALL_L3:
+ builder = builderDrawMsg(tvContent, fairyMsgInfo, "好運爆棚!");
+ break;
+ case CUSTOM_MSG_SUB_CONVERT_L1:
+ builder = builderConvertMsg(tvContent, fairyMsgInfo, "初級召喚");
+ break;
+ case CUSTOM_MSG_SUB_CONVERT_L2:
+ builder = builderConvertMsg(tvContent, fairyMsgInfo, "史詩召喚");
+ break;
+ case CUSTOM_MSG_SUB_CONVERT_L3:
+ builder = builderConvertMsg(tvContent, fairyMsgInfo, "傳說召喚");
+ break;
+ }
+
+ if (builder != null) {
+ if (GoldBoxHelper.isShowFairy()) {
+ builder.append(" 去參加!", new OriginalDrawStatusClickSpan(Color.parseColor("#FFBC51")) {
+ @Override
+ public void onClick(@NonNull View widget) {
+ StatisticManager.Instance().onEvent(StatisticsProtocol.EVENT_TREASURE_ELF_SCREEN_ENTRANCE_CLICK, "奪寶精靈公屏入口點擊");
+
+ HomeFairyActivity.start(mContext);
+ }
+ });
+ }
+ tvContent.setOnClickListener(null);
+ tvContent.setMovementMethod(new LinkMovementMethod());
+ tvContent.setText(builder.build());
+ }
+ }
+
+ }
+
+ private SpannableBuilder builderConvertMsg(TextView textView, @NonNull FairyMsgInfo fairyMsgInfo, String type) {
+ return new SpannableBuilder(textView)
+ .append("厲害了!", new ForegroundColorSpan(whiteColor))
+ .append(StringExtensionKt.subAndReplaceDot(fairyMsgInfo.getNick(), 7), new OriginalDrawStatusClickSpan(roomTipNickColor, false) {
+
+ @Override
+ public void onClick(@NonNull View widget) {
+ RxBus.get().post(new ShowUserInfoDialogEvent(String.valueOf(fairyMsgInfo.getUid())));
+ }
+ })
+ .append("在奪寶精靈中 " + type, new ForegroundColorSpan(whiteColor))
+ .append(fairyMsgInfo.getRewardShowValue() + "鑽" + fairyMsgInfo.getRewardName(), new ForegroundColorSpan(roomTipColor));
+ }
+
+ private SpannableBuilder builderDrawMsg(TextView textView, @NonNull FairyMsgInfo fairyMsgInfo, String desc) {
+ SpannableBuilder builder = new SpannableBuilder(textView)
+ .append(desc, new ForegroundColorSpan(whiteColor))
+ .append(StringExtensionKt.subAndReplaceDot(fairyMsgInfo.getNick(), 7), new OriginalDrawStatusClickSpan(roomTipNickColor, false) {
+
+ @Override
+ public void onClick(@NonNull View widget) {
+ RxBus.get().post(new ShowUserInfoDialogEvent(String.valueOf(fairyMsgInfo.getUid())));
+ }
+ })
+ .append(" 在奪寶精靈中獲得 ", new ForegroundColorSpan(whiteColor))
+ .append(fairyMsgInfo.getRewardName(), new ForegroundColorSpan(Color.WHITE));
+ if (fairyMsgInfo.getRewardNum() > 1) {
+ builder.append(" x" + fairyMsgInfo.getRewardNum(), new ForegroundColorSpan(roomTipNickColor));
+ }
+ return builder;
+ }
+
@SuppressLint("CheckResult")
private void setGiftCompoundMsg(ChatRoomMessage chatRoomMessage, TextView tvContent) {
if (chatRoomMessage.getAttachment() instanceof GiftCompoundAttachment) {
diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt
index 138e0fe9e..5b2046c94 100644
--- a/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt
+++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/RoomEffectView.kt
@@ -39,6 +39,7 @@ import com.yizhuan.erban.ui.webview.CommonWebViewActivity
import com.yizhuan.erban.ui.webview.DialogWebViewActivity
import com.yizhuan.erban.ui.widget.SimpleAnimListener
import com.yizhuan.erban.ui.widget.drawgift.DrawGiftPlayHelper
+import com.yizhuan.erban.utils.MsgBuilder
import com.yizhuan.erban.utils.SpannableBuilder
import com.yizhuan.xchat_android_constants.XChatConstants
import com.yizhuan.xchat_android_core.auth.AuthModel
@@ -136,6 +137,10 @@ class RoomEffectView @JvmOverloads constructor(
private var luckySeaSVGADisposable: Disposable? = null
private val messagesLuckySeaSVGA: MutableList by lazy { ArrayList() }
+ private var fairyAnimation: Animation? = null
+ private var fairyDisposable: Disposable? = null
+ private val fairyMessages: MutableList> by lazy { ArrayList() }
+
private fun loopCarAnim() {
if (context.isDestroyed()) return
isSvgaPlaying = false
@@ -221,6 +226,14 @@ class RoomEffectView @JvmOverloads constructor(
RoomEvent.LUCKY_SEA_GIFT_SERVER_NOTIFY -> {// 深海奇缘礼物全服飘屏通知
addLuckySeaNotifyBySVGA(roomEvent.chatRoomMessage)
}
+ RoomEvent.FAIRY_DRAW_GIFT_L4,
+ RoomEvent.FAIRY_DRAW_GIFT_L5,
+ RoomEvent.FAIRY_CONVERT_L1,
+ RoomEvent.FAIRY_CONVERT_L2,
+ RoomEvent.FAIRY_CONVERT_L3 -> addFairyNotify(
+ roomEvent.event,
+ roomEvent.chatRoomMessage
+ )
else -> {}
}
}
@@ -236,6 +249,105 @@ class RoomEffectView @JvmOverloads constructor(
})
}
+ /**
+ * 幸运池飘屏
+ *
+ * @param chatRoomMessage
+ */
+ private fun addFairyNotify(roomEvent: Int, chatRoomMessage: ChatRoomMessage) {
+ if (binding.clNotify.visibility == GONE) {
+ binding.clNotify.visibility = VISIBLE
+ }
+ fairyMessages.add(Pair(roomEvent, chatRoomMessage))
+ if (fairyDisposable == null || fairyMessages.size == 1) {
+ fairyDisposable = Observable.interval(0, PERIOD.toLong(), TimeUnit.MILLISECONDS)
+ .observeOn(AndroidSchedulers.mainThread())
+ .takeWhile { fairyMessages.size > 0 }
+ .subscribe {
+ showFairyNotify(
+ fairyMessages.removeAt(0)
+ )
+ }
+ }
+ }
+
+ private fun showFairyNotify(pair: Pair) {
+ val attachment = pair.second.attachment as FairyMsgAttachment
+ when (pair.first) {
+ RoomEvent.FAIRY_DRAW_GIFT_L4,
+ RoomEvent.FAIRY_CONVERT_L1,
+ RoomEvent.FAIRY_CONVERT_L2 -> {
+ val textView =
+ LayoutInflater.from(mContext)
+ .inflate(R.layout.layout_room_fairy_notify, null) as TextView
+ val text = MsgBuilder.buildFairyMsg(pair.first, attachment)
+ textView.text = text.build()
+ fairyAnimation = AnimationUtils.loadAnimation(mContext, R.anim.anim_box_notify)
+ binding.flFairyNotify.addView(textView)
+ textView.startAnimation(fairyAnimation)
+ binding.flFairyNotify.postDelayed(
+ { binding.flFairyNotify.removeView(textView) },
+ SHOW_TIME.toLong()
+ )
+ }
+ RoomEvent.FAIRY_DRAW_GIFT_L5,
+ RoomEvent.FAIRY_CONVERT_L3 -> {
+ showFairyNotifyBySVGA(pair)
+ }
+ }
+
+ }
+
+ private fun showFairyNotifyBySVGA(pair: Pair) {
+ val attachment = pair.second.attachment as FairyMsgAttachment
+ val text = MsgBuilder.buildFairyMsg(pair.first, attachment)
+ val svgaImageView = SVGAImageView(mContext)
+ svgaImageView.loops = 1
+ svgaImageView.clearsAfterStop = true
+ val params = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)
+ svgaImageView.layoutParams = params
+ svgaImageView.callback = object : SimpleSvgaCallback() {
+ override fun onFinished() {
+ binding.flFairyNotify.post {
+ binding.flFairyNotify.removeView(
+ svgaImageView
+ )
+ }
+ }
+ }
+ binding.flFairyNotify.addView(svgaImageView)
+ shareParser().decodeFromAssets(
+ "svga/all_fairy.svga",
+ object : SVGAParser.ParseCompletion {
+ override fun onComplete(videoItem: SVGAVideoEntity) {
+ val dynamicEntity = SVGADynamicEntity()
+ val textPaint = TextPaint()
+ textPaint.color = Color.WHITE //字体颜色
+ textPaint.textSize = 24f //字体大小
+ dynamicEntity.setDynamicText(
+ StaticLayout(
+ text.build(),
+ 0,
+ text.build().length,
+ textPaint,
+ 0,
+ Layout.Alignment.ALIGN_CENTER,
+ 1.0f,
+ 0.0f,
+ false
+ ), "touming_text_name"
+ )
+ val drawable = SVGADrawable(videoItem, dynamicEntity)
+ svgaImageView.setImageDrawable(drawable)
+ svgaImageView.startAnimation()
+ }
+
+ override fun onError() {}
+ },
+ null
+ )
+ }
+
/**
* 幸運池飄屏
*
diff --git a/app/src/main/java/com/yizhuan/erban/base/Event.kt b/app/src/main/java/com/yizhuan/erban/base/Event.kt
new file mode 100644
index 000000000..cc0809ce4
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/base/Event.kt
@@ -0,0 +1,27 @@
+package com.yizhuan.erban.base
+
+/**
+ * Used as a wrapper for data that is exposed via a LiveData that represents an event.
+ */
+open class Event(private val content: T) {
+
+ var hasBeenHandled = false
+ private set // Allow external read but not write
+
+ /**
+ * Returns the content and prevents its use again.
+ */
+ fun getContentIfNotHandled(): T? {
+ return if (hasBeenHandled) {
+ null
+ } else {
+ hasBeenHandled = true
+ content
+ }
+ }
+
+ /**
+ * Returns the content, even if it's already been handled.
+ */
+ fun peekContent(): T = content
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/common/EmptyViewHelper.java b/app/src/main/java/com/yizhuan/erban/common/EmptyViewHelper.java
index 8cb25ee32..47d293269 100644
--- a/app/src/main/java/com/yizhuan/erban/common/EmptyViewHelper.java
+++ b/app/src/main/java/com/yizhuan/erban/common/EmptyViewHelper.java
@@ -14,7 +14,7 @@ import com.yizhuan.xchat_android_library.utils.ResUtil;
public class EmptyViewHelper {
- public static View createEmptyView(Context context, String text) {
+ public static View createEmptyTextView(Context context, String text) {
if (!NetworkUtils.isNetworkAvailable(context)) text = ResUtil.getString(R.string.erban_common_emptyviewhelper_01);
View view = LayoutInflater.from(context).inflate(R.layout.layout_ktv_empty, null);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
diff --git a/app/src/main/java/com/yizhuan/erban/common/widget/OriginalDrawStatusClickSpan.java b/app/src/main/java/com/yizhuan/erban/common/widget/OriginalDrawStatusClickSpan.java
index 55f6c4e3b..16c0352d1 100644
--- a/app/src/main/java/com/yizhuan/erban/common/widget/OriginalDrawStatusClickSpan.java
+++ b/app/src/main/java/com/yizhuan/erban/common/widget/OriginalDrawStatusClickSpan.java
@@ -9,6 +9,7 @@ import androidx.annotation.NonNull;
public abstract class OriginalDrawStatusClickSpan extends ClickableSpan {
private final Integer mColor;
+ private final boolean underlineText;
public OriginalDrawStatusClickSpan() {
this(null);
@@ -16,13 +17,19 @@ public abstract class OriginalDrawStatusClickSpan extends ClickableSpan {
public OriginalDrawStatusClickSpan(@ColorInt Integer color) {
this.mColor = color;
+ this.underlineText = true;
+ }
+
+ public OriginalDrawStatusClickSpan(@ColorInt Integer color, boolean underlineText) {
+ this.mColor = color;
+ this.underlineText = underlineText;
}
@Override
public void updateDrawState(@NonNull TextPaint ds) {
if (mColor != null) {
ds.setColor(mColor);
- ds.setUnderlineText(true);
+ ds.setUnderlineText(underlineText);
}
}
diff --git a/app/src/main/java/com/yizhuan/erban/decoration/view/DecorationCommonFragment.kt b/app/src/main/java/com/yizhuan/erban/decoration/view/DecorationCommonFragment.kt
index e8daf1c2c..3451de8de 100644
--- a/app/src/main/java/com/yizhuan/erban/decoration/view/DecorationCommonFragment.kt
+++ b/app/src/main/java/com/yizhuan/erban/decoration/view/DecorationCommonFragment.kt
@@ -54,7 +54,7 @@ class DecorationCommonFragment : BaseViewBindingFragment(),
.setLayoutManager(LinearLayoutManager(context))
.setRecyclerView(binding.mRecyclerView)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
context,
getString(R.string.empty_data)
)
diff --git a/app/src/main/java/com/yizhuan/erban/fansteam/FansTeamJoinedActivity.kt b/app/src/main/java/com/yizhuan/erban/fansteam/FansTeamJoinedActivity.kt
index b97e72ce4..6a005927c 100644
--- a/app/src/main/java/com/yizhuan/erban/fansteam/FansTeamJoinedActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/fansteam/FansTeamJoinedActivity.kt
@@ -53,7 +53,7 @@ class FansTeamJoinedActivity : BaseViewBindingActivity(
.setRecyclerView(binding.recyclerView)
.setAdapter(VisitorListAdapter())
.setPageSize(pageSize)
- .setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.home_activity_visitorlistactivity_02)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.home_activity_visitorlistactivity_02)))
.build()
rvDelegate.adapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
diff --git a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java
index 9203a5073..30100b3eb 100644
--- a/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java
+++ b/app/src/main/java/com/yizhuan/erban/home/adapter/RoomActAdapter.java
@@ -12,6 +12,7 @@ import com.yizhuan.erban.R;
import com.yizhuan.erban.avroom.firstcharge.FirstChargeDialog;
import com.yizhuan.erban.shipantics.PullRadishActivity;
import com.yizhuan.erban.treasure_box.widget.GoldBoxHelper;
+import com.yizhuan.erban.treasurefairy.HomeFairyActivity;
import com.yizhuan.erban.ui.utils.ImageLoadUtils;
import com.yizhuan.erban.ui.widget.rollviewpager.adapter.StaticPagerAdapter;
import com.yizhuan.erban.utils.CommonJumpHelper;
@@ -42,7 +43,9 @@ public class RoomActAdapter extends StaticPagerAdapter {
BannerInfo bannerInfo = data.get(position);
String actId = String.valueOf(bannerInfo.getBannerId());
ivCover.setScaleType(ImageView.ScaleType.CENTER_CROP);
- if (bannerInfo.isFirstCharge()) {
+ if (bannerInfo.isFairy()) {
+ ivCover.setImageResource(R.drawable.ic_fairy_entrance);
+ } else if (bannerInfo.isFirstCharge()) {
ivCover.setImageResource(R.drawable.ic_first_charge_enter);
} else if (bannerInfo.isBox()) {
GlideApp.with(BasicConfig.INSTANCE.getAppContext())
@@ -55,7 +58,9 @@ public class RoomActAdapter extends StaticPagerAdapter {
ImageLoadUtils.loadImage(mContext, bannerInfo.getBannerPic(), ivCover, R.drawable.default_cover);
}
ivCover.setOnClickListener(v -> {
- if (bannerInfo.isFirstCharge()) {
+ if (bannerInfo.isFairy()) {
+ HomeFairyActivity.start(mContext);
+ } else if (bannerInfo.isFirstCharge()) {
FirstChargeDialog.start(mContext);
} else if (bannerInfo.isBox()) {
GoldBoxHelper.handleBoxClick(mContext);
diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/RoomCommonFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/RoomCommonFragment.kt
index 60447b41c..8be8e08af 100644
--- a/app/src/main/java/com/yizhuan/erban/home/fragment/RoomCommonFragment.kt
+++ b/app/src/main/java/com/yizhuan/erban/home/fragment/RoomCommonFragment.kt
@@ -52,7 +52,7 @@ class RoomCommonFragment : BaseViewBindingFragment()
.setAdapter(mAdapter)
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(20)
- .setEmptyView(EmptyViewHelper.createEmptyView(mContext, ResUtil.getString(R.string.home_fragment_roomcommonfragment_01)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(mContext, ResUtil.getString(R.string.home_fragment_roomcommonfragment_01)))
.setRefreshLayout(binding.refreshLayout)
.setRecyclerView(binding.recyclerView)
.build()
diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/RoomGameFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/RoomGameFragment.kt
index b13d8169e..4c59b9106 100644
--- a/app/src/main/java/com/yizhuan/erban/home/fragment/RoomGameFragment.kt
+++ b/app/src/main/java/com/yizhuan/erban/home/fragment/RoomGameFragment.kt
@@ -48,7 +48,7 @@ class RoomGameFragment : BaseViewBindingFragment() {
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.home_fragment_roomgamefragment_01)
)
diff --git a/app/src/main/java/com/yizhuan/erban/home/fragment/RoomLikeFragment.kt b/app/src/main/java/com/yizhuan/erban/home/fragment/RoomLikeFragment.kt
index 9fe863f9a..27e9c441e 100644
--- a/app/src/main/java/com/yizhuan/erban/home/fragment/RoomLikeFragment.kt
+++ b/app/src/main/java/com/yizhuan/erban/home/fragment/RoomLikeFragment.kt
@@ -74,7 +74,7 @@ class RoomLikeFragment : BaseViewBindingFragment() {
.setLayoutManager(LinearLayoutManager(mContext))
.setPageSize(pageSize)
.setRefreshLayout(binding.refreshLayout)
- .setEmptyView(EmptyViewHelper.createEmptyView(mContext, ResUtil.getString(R.string.home_fragment_roomlikefragment_01)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(mContext, ResUtil.getString(R.string.home_fragment_roomlikefragment_01)))
.setRecyclerView(binding.rvCollect)
.build()
diff --git a/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldActivity.kt b/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldActivity.kt
index e6fdad5a7..959a6a99d 100644
--- a/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldActivity.kt
@@ -72,7 +72,7 @@ class GiveGoldActivity : BaseViewBindingActivity() {
.setLayoutManager(LinearLayoutManager(this))
.setPageSize(20)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
this,
ResUtil.getString(R.string.me_give_gold_empty)
)
diff --git a/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldSearchActivity.kt b/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldSearchActivity.kt
index c0f460752..79a2deb7d 100644
--- a/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldSearchActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/pay/activity/GiveGoldSearchActivity.kt
@@ -40,7 +40,7 @@ class GiveGoldSearchActivity : BaseActivity(), TextWatcher {
val adapter = GiveSearchAdapter()
rvDelegate = RVDelegate.Builder()
.setPageSize(Int.MAX_VALUE)
- .setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.pay_activity_givegoldsearchactivity_01)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.pay_activity_givegoldsearchactivity_01)))
.setLayoutManager(LinearLayoutManager(this))
.setRecyclerView(recyclerView)
.setAdapter(adapter)
diff --git a/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveDiamondFragment.kt b/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveDiamondFragment.kt
index 7834f6a66..6bb9e1a90 100644
--- a/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveDiamondFragment.kt
+++ b/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveDiamondFragment.kt
@@ -45,7 +45,7 @@ class GiveDiamondFragment : BaseViewBindingFragment(
.setLayoutManager(LinearLayoutManager(context))
.setPageSize(20)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.me_give_gold_empty)
)
diff --git a/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveGiftFragment.kt b/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveGiftFragment.kt
index 101df8fcf..2732a052f 100644
--- a/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveGiftFragment.kt
+++ b/app/src/main/java/com/yizhuan/erban/pay/fragment/GiveGiftFragment.kt
@@ -46,7 +46,7 @@ class GiveGiftFragment : BaseViewBindingFragment() {
.setLayoutManager(LinearLayoutManager(context))
.setPageSize(20)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.me_give_gold_empty)
)
diff --git a/app/src/main/java/com/yizhuan/erban/relation/cp/activity/CpInviteRecordActivity.kt b/app/src/main/java/com/yizhuan/erban/relation/cp/activity/CpInviteRecordActivity.kt
index 6f777c5f8..96d43bfcb 100644
--- a/app/src/main/java/com/yizhuan/erban/relation/cp/activity/CpInviteRecordActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/relation/cp/activity/CpInviteRecordActivity.kt
@@ -86,7 +86,7 @@ class CpInviteRecordActivity : BaseBindingActivity() {
adapter.setNewData(it)
if (it.isEmpty()) {
adapter.setHeaderAndEmpty(false)
- adapter.emptyView = createEmptyView()
+ adapter.emptyView = createEmptyTextView()
}
dialogManager.dismissDialog()
},
@@ -89,15 +89,15 @@ class SkillHomeActivity : BaseBindingActivity() {
toast(th.message)
mBinding.refreshLayout.isRefreshing = false
adapter.setHeaderAndEmpty(false)
- adapter.emptyView = createEmptyView()
+ adapter.emptyView = createEmptyTextView()
dialogManager.dismissDialog()
})
}
- private fun createEmptyView(): View {
+ private fun createEmptyTextView(): View {
if (pageType == PAGE_TYPE_CUSTOM) {
- return EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.skill_activity_skillhomeactivity_02))
+ return EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.skill_activity_skillhomeactivity_02))
}
val rootView = FrameLayout(this)
rootView.layoutParams =
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/FairyViewModel.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/FairyViewModel.kt
new file mode 100644
index 000000000..2e3b1cdf0
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/FairyViewModel.kt
@@ -0,0 +1,468 @@
+package com.yizhuan.erban.treasurefairy
+
+import android.util.SparseArray
+import androidx.core.util.forEach
+import androidx.lifecycle.LiveData
+import androidx.lifecycle.MutableLiveData
+import com.yizhuan.erban.base.BaseViewModel
+import com.yizhuan.erban.base.Event
+import com.yizhuan.erban.treasurefairy.view.MyFairyItemView
+import com.yizhuan.xchat_android_core.bean.response.ListResult
+import com.yizhuan.xchat_android_core.gift.bean.SimpleUserInfo
+import com.yizhuan.xchat_android_core.treasurefairy.*
+import com.yizhuan.xchat_android_core.utils.net.ServerException
+import com.yizhuan.xchat_android_core.utils.toast
+
+class FairyViewModel : BaseViewModel() {
+
+ private val _drawInfoLiveData = MutableLiveData()
+ val drawInfoLiveData: MutableLiveData = _drawInfoLiveData
+
+ private val _prizeInfoListLiveData = MutableLiveData?>()
+ val prizeInfoListLiveData: MutableLiveData?> = _prizeInfoListLiveData
+
+ private val _resultLiveData = MutableLiveData>?>()
+ val resultLiveData: MutableLiveData>?> = _resultLiveData
+
+ private val _showGetKeyLiveData = MutableLiveData>()
+ val showGetKeyLiveData: LiveData> = _showGetKeyLiveData
+
+ private val _drawForestLiveData = MutableLiveData>?>()
+ val drawForestLiveData: MutableLiveData>?> = _drawForestLiveData
+
+ private val _forestInfoLiveData = MutableLiveData()
+ val forestInfoLiveData: MutableLiveData = _forestInfoLiveData
+
+ private val _forestPoolLiveData = MutableLiveData?>?>()
+ val forestPoolLiveData: MutableLiveData?>?> = _forestPoolLiveData
+
+ private val _forestRecordLiveData = MutableLiveData>()
+ val forestRecordLiveData: LiveData> = _forestRecordLiveData
+
+ private val _myFairyInfoLiveData = MutableLiveData()
+ val myFairyInfoLiveData: MutableLiveData = _myFairyInfoLiveData
+
+ private val _friendsListLiveData = MutableLiveData?>()
+ val friendsListLiveData: MutableLiveData?> = _friendsListLiveData
+
+ private val _sendFairyLiveData = MutableLiveData>()
+ val sendFairyLiveData: LiveData> = _sendFairyLiveData
+
+ private val _sendFairyRecordLiveData = MutableLiveData>()
+ val sendFairyRecordLiveData: LiveData> = _sendFairyRecordLiveData
+
+ private val _compoundFairyInfosLiveData = MutableLiveData?>()
+ val compoundFairyInfosLiveData: MutableLiveData?> = _compoundFairyInfosLiveData
+
+ private val _testResultLiveData = MutableLiveData?>()
+ val testResultLiveData: MutableLiveData?> = _testResultLiveData
+
+ private val _testLegendResultLiveData = MutableLiveData?>()
+ val testLegendResultLiveData: MutableLiveData?> = _testLegendResultLiveData
+
+ private val _testRecordLiveData = MutableLiveData>()
+ val testRecordLiveData: LiveData> = _testRecordLiveData
+
+ private val _exchangeGiftListLiveData = MutableLiveData?>()
+ val exchangeGiftListLiveData: MutableLiveData?> = _exchangeGiftListLiveData
+
+ private val _exchangeGiftLiveData = MutableLiveData>()
+ val exchangeGiftLiveData: LiveData> = _exchangeGiftLiveData
+
+ private val _debrisExchangeListLiveData = MutableLiveData?>()
+ val debrisExchangeListLiveData: MutableLiveData?> = _debrisExchangeListLiveData
+
+ private val _debrisExchangeLiveData = MutableLiveData>()
+ val debrisExchangeLiveData: LiveData> = _debrisExchangeLiveData
+
+ private val _exchangeFairyRecordLiveData = MutableLiveData>()
+ val exchangeFairyRecordLiveData: LiveData> =
+ _exchangeFairyRecordLiveData
+
+ private val _exchangeDebrisRecordLiveData = MutableLiveData>()
+ val exchangeDebrisRecordLiveData: LiveData> =
+ _exchangeDebrisRecordLiveData
+
+ init {
+ initPrizeInfoList()
+ }
+
+ fun initDrawInfo() {
+ safeLaunch(
+ onError = {
+ _drawInfoLiveData.value = null
+ },
+ block = {
+ _drawInfoLiveData.value = TreasureFairyModel.getDrawInfo()
+ }
+ )
+ }
+
+ fun initPrizeInfoList() {
+ safeLaunch(
+ onError = {
+ _prizeInfoListLiveData.value = null
+ },
+ block = {
+ _prizeInfoListLiveData.value = TreasureFairyModel.getPrizeInfoList()
+ }
+ )
+ }
+
+ fun drawFairy(drawNum: Int) {
+ safeLaunch(
+ onError = {
+ if (it is ServerException && it.code == 211188) {
+ _showGetKeyLiveData.value = Event(true)
+ } else {
+ it.message.toast()
+ }
+ _resultLiveData.value = null
+ },
+ block = {
+ val result = TreasureFairyModel.drawTreasureFairy(drawNum)
+ _resultLiveData.value = result?.let { Event(it) }
+ _drawInfoLiveData.value = TreasureFairyModel.getDrawInfo()
+ }
+ )
+ }
+
+ fun drawForestFairy(drawNum: Int, poolLevel: Int) {
+ safeLaunch(
+ onError = {
+ it.message.toast()
+ _drawForestLiveData.value = null
+ },
+ block = {
+ val result = TreasureFairyModel.drawForestFairy(drawNum, poolLevel)
+ _drawForestLiveData.value = result?.let { Event(it) }
+ _forestInfoLiveData.value = TreasureFairyModel.getForestInfo()
+ }
+ )
+ }
+
+ fun cleanDrawForestLiveData() {
+ _drawForestLiveData.value = null
+ }
+
+ fun getForestInfo() {
+ safeLaunch(
+ onError = {
+ _forestInfoLiveData.value = null
+ },
+ block = {
+ _forestInfoLiveData.value = TreasureFairyModel.getForestInfo()
+ }
+ )
+ }
+
+ fun getForestPrizePool(poolLevel: Int) {
+ safeLaunch(
+ onError = {
+ _forestPoolLiveData.value = null
+ },
+ block = {
+ _forestPoolLiveData.value =
+ Pair(poolLevel, TreasureFairyModel.getForestPrizePool(poolLevel))
+ }
+ )
+ }
+
+ fun getForestRecord(
+ page: Int,
+ pageSize: Int
+ ) {
+ safeLaunch(
+ onError = {
+ _forestRecordLiveData.value = ListResult.failed(page)
+ },
+ block = {
+ val result = TreasureFairyModel.getForestRecord(page, pageSize)
+ _forestRecordLiveData.value = ListResult.success(result, page)
+ }
+ )
+ }
+
+ fun getMyFairyInfo() {
+ safeLaunch(
+ onError = {
+ _myFairyInfoLiveData.value = null
+ it.message.toast()
+ },
+ block = {
+ _myFairyInfoLiveData.value = TreasureFairyModel.getMyFairyInfo()
+ }
+ )
+ }
+
+ fun getFriendsList(nick: String? = null) {
+ safeLaunch(
+ onError = {
+ _friendsListLiveData.value = null
+ it.message.toast()
+ },
+ block = {
+ _friendsListLiveData.value = TreasureFairyModel.getFriendsList(nick)
+ }
+ )
+ }
+
+
+ fun askForFairy(elfId: Long, targetUid: Long) {
+ safeLaunch(
+ onError = {
+ _sendFairyLiveData.value = Event(false)
+ it.message.toast()
+ },
+ block = {
+ TreasureFairyModel.askForFairy(elfId, targetUid)
+ _sendFairyLiveData.value = Event(true)
+ "已向好友發送索要信息".toast()
+ }
+ )
+ }
+
+ fun sendFairy(elfId: Long, targetUid: Long) {
+ safeLaunch(
+ onError = {
+ _sendFairyLiveData.value = Event(false)
+ it.message.toast()
+ },
+ block = {
+ TreasureFairyModel.sendFairy(elfId, targetUid)
+ _sendFairyLiveData.value = Event(true)
+ "贈送成功!".toast()
+ }
+ )
+ }
+
+ fun getSendFairyList(
+ page: Int,
+ pageSize: Int
+ ) {
+ safeLaunch(
+ onError = {
+ _sendFairyRecordLiveData.value = ListResult.failed(page)
+ },
+ block = {
+ val result = TreasureFairyModel.getSendFairyList(page, pageSize)
+ _sendFairyRecordLiveData.value = ListResult.success(result, page)
+ }
+ )
+ }
+
+ fun cleanTestParam() {
+ _compoundFairyInfosLiveData.value = null
+ _testLegendResultLiveData.value = null
+ _testResultLiveData.value = null
+ val myFairyInfo = _myFairyInfoLiveData.value
+ myFairyInfo?.lowElves?.forEach {
+ it.selectedNum = 0
+ }
+ myFairyInfo?.middleElves?.forEach {
+ it.selectedNum = 0
+ }
+ _myFairyInfoLiveData.value = myFairyInfo
+ }
+
+ fun addTestFairy(fairyInfo: FairyInfo) {
+ val array = _compoundFairyInfosLiveData.value ?: SparseArray()
+
+ if (array.size() >= 3) {
+ "試煉爐已滿!".toast()
+ } else {
+ if (fairyInfo.elfNum == 0) {
+ "你還未捕捉到該精靈".toast()
+ return
+ }
+ var selectedNum = 0
+ array.forEach { _, value ->
+ if (value.elfId == fairyInfo.elfId) {
+ selectedNum++
+ }
+ }
+
+ if (selectedNum + 1 > fairyInfo.elfNum) {
+ "精靈數量不足".toast()
+ return
+ }
+ array.put(nextIndex(array), fairyInfo)
+
+ fairyInfo.selectedNum = selectedNum + 1
+
+ _compoundFairyInfosLiveData.value = array
+ }
+ }
+
+ fun minusTestFairy(index: Int) {
+ val array = _compoundFairyInfosLiveData.value ?: SparseArray()
+ val fairyInfo = array.get(index)
+ if (fairyInfo != null) {
+ array.remove(index)
+ var selectedNum = 0
+ array.forEach { _, value ->
+ if (value.elfId == fairyInfo.elfId) {
+ selectedNum++
+ }
+ }
+ fairyInfo.selectedNum = selectedNum
+ _compoundFairyInfosLiveData.value = array
+ }
+ }
+
+ fun oneKeyAdd(fairyInfos: List) {
+ val compoundFairyInfos = _compoundFairyInfosLiveData.value ?: SparseArray()
+ var needNum = 3 - compoundFairyInfos.size()
+ if (needNum == 0) {
+ "試煉爐已滿!".toast()
+ return
+ }
+ fairyInfos.forEach {
+ while (it.elfNum - it.selectedNum > 0 && needNum > 0) {
+ it.selectedNum++
+ needNum--
+ compoundFairyInfos.put(nextIndex(compoundFairyInfos), it)
+ }
+ }
+ if (needNum == 3) {
+ "精靈數量不足".toast()
+ return
+ }
+ _compoundFairyInfosLiveData.value = compoundFairyInfos
+ }
+
+ private fun nextIndex(fairyInfos: SparseArray): Int {
+ return when {
+ fairyInfos.get(0) == null -> {
+ 0
+ }
+ fairyInfos.get(1) == null -> {
+ 1
+ }
+ else -> {
+ 2
+ }
+ }
+ }
+
+ fun testFairy(level: Int): Boolean {
+ val fairyInfos = _compoundFairyInfosLiveData.value ?: SparseArray()
+ if (fairyInfos.size() != 3) {
+ "精靈數量不足".toast()
+ return false
+ }
+ safeLaunch(
+ onError = {
+ if (level == MyFairyItemView.EPIC) {
+ _testLegendResultLiveData.value = null
+ } else {
+ _testResultLiveData.value = null
+ }
+
+ it.message.toast()
+ },
+ block = {
+ val fairyTestParam = FairyTestParam()
+ fairyInfos.forEach { _, value ->
+ fairyTestParam.expendList.add(Compound(value.elfId, 1))
+ }
+ fairyTestParam.level = level
+ val result = TreasureFairyModel.testFairy(fairyTestParam)
+ (if (level == MyFairyItemView.EPIC) {
+ _testLegendResultLiveData
+ } else {
+ _testResultLiveData
+ }).value = result?.let { Event(it) }
+ getMyFairyInfo()
+ }
+ )
+ return true
+ }
+
+ fun getTestFairyRecordList(
+ page: Int,
+ pageSize: Int
+ ) {
+ safeLaunch(
+ onError = {
+ _testRecordLiveData.value = ListResult.failed(page)
+ },
+ block = {
+ val result = TreasureFairyModel.getTestFairyRecordList(page, pageSize)
+ _testRecordLiveData.value = ListResult.success(result, page)
+ }
+ )
+ }
+
+ fun getExchangeGiftInfoList() {
+ safeLaunch(
+ onError = {
+ _exchangeGiftListLiveData.value = null
+ },
+ block = {
+ val result = TreasureFairyModel.getExchangeGiftInfoList()
+ _exchangeGiftListLiveData.value = result
+ }
+ )
+ }
+
+
+ fun getDebrisExchangeList() {
+ safeLaunch(
+ onError = {
+ _debrisExchangeListLiveData.value = null
+ },
+ block = {
+ val result = TreasureFairyModel.getDebrisExchangeList()
+ _debrisExchangeListLiveData.value = result
+ }
+ )
+ }
+
+ fun exchangeGift(itemId: Long) {
+ safeLaunch {
+ val result = TreasureFairyModel.exchangeGift(itemId)
+ _exchangeGiftLiveData.value = result?.let { Event(it) }
+ _myFairyInfoLiveData.value = TreasureFairyModel.getMyFairyInfo()
+ }
+ }
+
+ fun debrisExchange(itemId: Long) {
+ safeLaunch {
+ val result = TreasureFairyModel.exchangeGift(itemId)
+ _debrisExchangeLiveData.value = result?.let { Event(it) }
+ _myFairyInfoLiveData.value = TreasureFairyModel.getMyFairyInfo()
+ }
+ }
+
+ fun getExchangeFairyRecord(
+ page: Int,
+ pageSize: Int
+ ) {
+ safeLaunch(
+ onError = {
+ _exchangeFairyRecordLiveData.value = ListResult.failed(page)
+ },
+ block = {
+ val result = TreasureFairyModel.getExchangeRecord(1, page, pageSize)
+ _exchangeFairyRecordLiveData.value = ListResult.success(result, page)
+ }
+ )
+ }
+
+ fun getExchangeDebrisRecord(
+ page: Int,
+ pageSize: Int
+ ) {
+ safeLaunch(
+ onError = {
+ _exchangeDebrisRecordLiveData.value = ListResult.failed(page)
+ },
+ block = {
+ val result = TreasureFairyModel.getExchangeRecord(2, page, pageSize)
+ _exchangeDebrisRecordLiveData.value = ListResult.success(result, page)
+ }
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/HomeFairyActivity.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/HomeFairyActivity.kt
new file mode 100644
index 000000000..51e226168
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/HomeFairyActivity.kt
@@ -0,0 +1,289 @@
+package com.yizhuan.erban.treasurefairy
+
+import android.animation.ObjectAnimator
+import android.annotation.SuppressLint
+import android.content.Context
+import android.content.Intent
+import android.graphics.Path
+import android.text.style.ForegroundColorSpan
+import android.view.*
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.activity.viewModels
+import androidx.core.content.ContextCompat
+import androidx.core.graphics.toColorInt
+import com.netease.nim.uikit.common.util.sys.ScreenUtil
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingActivity
+import com.yizhuan.erban.common.widget.dialog.DialogManager
+import com.yizhuan.erban.databinding.TreasureFairyDialogHomeBinding
+import com.yizhuan.erban.treasurefairy.dialog.ForestFairyDialog
+import com.yizhuan.erban.treasurefairy.dialog.HomeMorePopupWindow
+import com.yizhuan.erban.treasurefairy.dialog.HomePrizeDialog
+import com.yizhuan.erban.treasurefairy.dialog.MyFairyDialog
+import com.yizhuan.erban.treasurefairy.view.CustomDrawable
+import com.yizhuan.erban.ui.webview.FairyDialogWebViewActivity
+import com.yizhuan.erban.utils.SpannableBuilder
+import com.yizhuan.xchat_android_core.UriProvider
+import com.yizhuan.xchat_android_core.statistic.StatisticManager
+import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+import io.reactivex.Observable
+import io.reactivex.android.schedulers.AndroidSchedulers
+import io.reactivex.disposables.Disposable
+import java.util.concurrent.TimeUnit
+
+/**
+ * author: wushaocheng
+ * time: 2023/3/7
+ * desc: 奪寶精靈
+ */
+class HomeFairyActivity : BaseViewBindingActivity() {
+ private var selectIndex = 0
+ private var targetIndex: Int = -1
+ private val removeRunnable = Runnable { binding.llPrizeHint.removeAllViews() }
+ private val hintPrizeCacheList = ArrayList()
+
+
+ private var disposable: Disposable? = null
+ private val viewModel: FairyViewModel by viewModels()
+
+ companion object {
+ @JvmStatic
+ fun start(context: Context) {
+ val starter = Intent(context, HomeFairyActivity::class.java)
+ context.startActivity(starter)
+ }
+ }
+
+ private val fairyItems by lazy {
+ listOf(
+ binding.fairyItem0, binding.fairyItem1, binding.fairyItem2, binding.fairyItem3,
+ binding.fairyItem4, binding.fairyItem5, binding.fairyItem6, binding.fairyItem7,
+ binding.fairyItem8, binding.fairyItem9, binding.fairyItem10, binding.fairyItem11
+ )
+ }
+
+ @SuppressLint("SetTextI18n")
+ override fun init() {
+ //這裏的height用MATCH_PARENT狀態欄會被頂上去,不知道什麼鬼
+ window.setLayout(
+ WindowManager.LayoutParams.MATCH_PARENT,
+ ScreenUtil.screenHeight - ScreenUtil.getStatusBarHeight(this)
+ )
+ window.setGravity(Gravity.BOTTOM)
+ binding.fairyItem0.isSelected = true
+ looperHintPrize()
+ binding.tvKeyNum.setOnClickListener {
+ FairyDialogWebViewActivity.start(this, UriProvider.getFairyKey())
+ }
+ binding.ivMyFairy.setOnClickListener {
+ MyFairyDialog.newInstance().show(this)
+ }
+ binding.ivFairyTreasure.setOnClickListener {
+ ForestFairyDialog.newInstance().show(this)
+ }
+ binding.ivOpen1.setOnClickListener {
+ if (checkKeyNum(1)) {
+ rotatePrize()
+ viewModel.drawFairy(1)
+ }
+
+ }
+ binding.ivOpen10.setOnClickListener {
+ if (checkKeyNum(10)) {
+ rotatePrize()
+ viewModel.drawFairy(10)
+ }
+ }
+
+ binding.ivOpen100.setOnClickListener {
+ if (checkKeyNum(100)) {
+ rotatePrize()
+ viewModel.drawFairy(100)
+ }
+ }
+ binding.rootView.setOnClickListener { finish() }
+ binding.viewBg.setOnClickListener {
+ //do nothing
+ }
+
+ binding.ivMore.setOnClickListener {
+ val popupWindow = HomeMorePopupWindow(context)
+ popupWindow.show(binding.ivMore, Gravity.BOTTOM or Gravity.CENTER_HORIZONTAL)
+ }
+
+ binding.viewPrizeClick.setOnClickListener {
+ if (disposable?.isDisposed == false && targetIndex != -1) {
+ fairyItems[selectIndex].isSelected = false
+ fairyItems[targetIndex].isSelected = true
+ selectIndex = targetIndex
+ targetIndex = -1
+ HomePrizeDialog.newInstance().show(context)
+ disposable?.dispose()
+ }
+ }
+
+ viewModel.prizeInfoListLiveData.observe(this) {
+ it?.forEachIndexed { index, prizeInfo ->
+ if (index < fairyItems.size) {
+ fairyItems[index].setPrizeInfo(prizeInfo)
+ }
+ }
+ }
+
+ viewModel.resultLiveData.observe(this) { event ->
+ event?.getContentIfNotHandled()?.let {
+ targetIndex = viewModel.prizeInfoListLiveData.value
+ ?.indexOfFirst { prize ->
+ it[0].itemIndex == prize.itemIndex
+ } ?: -2
+ if (targetIndex == -2) {
+ viewModel.initPrizeInfoList()
+ }
+ hintPrizeCacheList.addAll(it.filter { prizeInfo -> prizeInfo.rewardLevel >= 3 })
+ } ?: run {
+ targetIndex = -1
+ disposable?.dispose()
+ }
+ }
+
+ viewModel.drawInfoLiveData.observe(this) {
+ it?.let {
+ binding.tvKeyNum.text = it.drawTicketNum.toString()
+ binding.tvCurrentLuckyValue.text = it.luckyNum.toString()
+
+ binding.tvShortLuckyValue.text =
+ SpannableBuilder()
+ .append("幸運值達到", ForegroundColorSpan("#59FDFF".toColorInt()))
+ .append("${it.needLuckyNum}", ForegroundColorSpan("#FFE8AA".toColorInt()))
+ .append("后,下次奪寶獲贈精靈球", ForegroundColorSpan("#59FDFF".toColorInt()))
+ .build()
+ binding.ivLuckyStone.post {
+ val drawable =
+ CustomDrawable(
+ ContextCompat.getDrawable(
+ this,
+ R.drawable.treasure_fairy_ic_lucky_stone
+ )!!
+ )
+ val path = Path()
+ path.addRect(
+ 0f,
+ 0f,
+ binding.ivLuckyStone.width.toFloat(),
+ binding.ivLuckyStone.height *
+ (1 - it.luckyNum / it.needLuckyNum.toFloat().coerceAtLeast(1f)),
+ Path.Direction.CW
+ )
+ drawable.setSrcPath(path)
+ binding.ivLuckyStone.setImageDrawable(drawable)
+ }
+ }
+ }
+
+ viewModel.showGetKeyLiveData.observe(this) {
+ it.getContentIfNotHandled()?.let {
+ DialogManager(context).showOkCancelDialog("購買限時裝扮活動奪寶券", "去參与", "取消") {
+ FairyDialogWebViewActivity.start(context, UriProvider.getFairyKey())
+ }
+ }
+ }
+ }
+
+ private fun checkKeyNum(num: Int): Boolean {
+ StatisticManager.Instance().onEvent(
+ StatisticsProtocol.EVENT_TREASURE_ELF_LOTTERY_CLICK, "奪寶精靈抽獎點擊",
+ mapOf("open_count" to "${num}次")
+ )
+ val keyNum = binding.tvKeyNum.text.toString().toInt()
+ if (keyNum >= num) {
+ return true
+ }
+ DialogManager(context).showOkCancelDialog("購買限時裝扮活動奪寶券", "去參与", "取消") {
+ FairyDialogWebViewActivity.start(context, UriProvider.getFairyKey())
+ }
+ return false
+ }
+
+ override fun onResume() {
+ super.onResume()
+ viewModel.initDrawInfo()
+ }
+
+ private fun rotatePrize() {
+ enabledOpenBtn(false)
+ targetIndex = -1
+ var minCount = 0
+ disposable?.dispose()
+ disposable = Observable.interval(70, TimeUnit.MILLISECONDS)
+ .observeOn(AndroidSchedulers.mainThread())
+ .compose(bindToLifecycle())
+ .doOnNext {
+ fairyItems[selectIndex].isSelected = false
+ selectIndex++
+ minCount++
+ if (selectIndex == fairyItems.size) selectIndex = 0
+ if (targetIndex != -2) {
+ fairyItems[selectIndex].isSelected = true
+ }
+ if ((selectIndex == targetIndex || targetIndex == -2) && minCount >= 24) {
+ HomePrizeDialog.newInstance().show(context)
+ disposable?.dispose()
+ }
+ }
+ .doFinally { enabledOpenBtn(true) }
+ .subscribe()
+ }
+
+ private fun enabledOpenBtn(enable: Boolean) {
+ binding.ivOpen1.isEnabled = enable
+ binding.ivOpen10.isEnabled = enable
+ binding.ivOpen100.isEnabled = enable
+ }
+
+ @SuppressLint("CheckResult")
+ private fun looperHintPrize() {
+ Observable.interval(0, 250, TimeUnit.MILLISECONDS)
+ .compose(bindToLifecycle())
+ .observeOn(AndroidSchedulers.mainThread())
+ .filter { hintPrizeCacheList.size > 0 }
+ .subscribe(
+ {
+ addPrizeHintView(hintPrizeCacheList.removeAt(0))
+ }) { looperHintPrize() } //出錯了繼續looper......
+ }
+
+ private fun addPrizeHintView(prizeInfo: PrizeInfo) {
+ binding.llPrizeHint.removeCallbacks(removeRunnable)
+ binding.llPrizeHint.postDelayed(removeRunnable, 3000)
+ val linearLayout =
+ LayoutInflater.from(context)
+ .inflate(R.layout.item_fairy_prize_hint, null) as LinearLayout
+ val layoutParams =
+ LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ScreenUtil.dip2px(25f))
+ layoutParams.setMargins(0, 0, 0, ScreenUtil.dip2px(5f))
+ linearLayout.layoutParams = layoutParams
+ linearLayout.setBackgroundResource(R.drawable.treasure_fairy_bg_big_prize)
+ linearLayout.setPadding(ScreenUtil.dip2px(10f), 0, ScreenUtil.dip2px(10f), 0)
+ binding.llPrizeHint.addView(linearLayout)
+ if (binding.llPrizeHint.childCount > 6) {
+ binding.llPrizeHint.removeViewAt(0)
+ }
+ for (i in 0 until binding.llPrizeHint.childCount) {
+ ObjectAnimator.ofFloat(
+ binding.llPrizeHint.getChildAt(i),
+ "translationY",
+ ScreenUtil.dip2px(25f).toFloat(),
+ 0f
+ )
+ .setDuration(200)
+ .start()
+ }
+ (linearLayout.findViewById(R.id.tv_prize_name) as TextView).text =
+ prizeInfo.rewardName
+ (linearLayout.findViewById(R.id.tv_prize_num) as TextView).text =
+ "x" + prizeInfo.rewardNum
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeDebrisAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeDebrisAdapter.kt
new file mode 100644
index 000000000..bc94e2ef3
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeDebrisAdapter.kt
@@ -0,0 +1,19 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+
+class ExchangeDebrisAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_exchange_debris) {
+
+ override fun convert(helper: BaseViewHolder, item: ExchangeGiftInfo) {
+ ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_prize_icon), item.rewardPicUrl)
+ helper.setText(R.id.tv_prize_name, item.getPrizeName())
+ helper.setText(R.id.tv_need_num, "${item.expendNum}")
+ helper.addOnClickListener(R.id.tv_exchange)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeDebrisRecordAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeDebrisRecordAdapter.kt
new file mode 100644
index 000000000..41f7b37f6
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeDebrisRecordAdapter.kt
@@ -0,0 +1,24 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+import java.text.SimpleDateFormat
+import java.util.*
+
+class ExchangeDebrisRecordAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_exchange_debris_record) {
+
+ private val formatYear = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA)
+ private val formatHour = SimpleDateFormat("HH:mm:ss", Locale.CHINA)
+
+ override fun convert(helper: BaseViewHolder, item: ExchangeGiftInfo) {
+
+ helper.setText(R.id.tv_time_year, formatYear.format(item.createTime))
+ helper.setText(R.id.tv_time_hour, formatHour.format(item.createTime))
+ helper.setText(R.id.tv_prize_name, item.rewardName)
+ helper.setText(R.id.tv_prize_num, item.getPrizeUnit())
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeFairyRecordAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeFairyRecordAdapter.kt
new file mode 100644
index 000000000..b704584df
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeFairyRecordAdapter.kt
@@ -0,0 +1,30 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+import java.text.SimpleDateFormat
+import java.util.*
+
+class ExchangeFairyRecordAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_exchange_fairy_record) {
+
+ private val formatYear = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA)
+ private val formatHour = SimpleDateFormat("HH:mm:ss", Locale.CHINA)
+
+ override fun convert(helper: BaseViewHolder, item: ExchangeGiftInfo) {
+
+ helper.setText(R.id.tv_time_year, formatYear.format(item.createTime))
+ helper.setText(R.id.tv_time_hour, formatHour.format(item.createTime))
+ helper.setText(R.id.tv_prize_name, "${item.rewardName}x${item.rewardNum}")
+ helper.setText(
+ R.id.tv_prize_type, when (item.convertLevel) {
+ 1 -> mContext.getString(R.string.fairy_primary_call)
+ 2 -> mContext.getString(R.string.fairy_epic_call)
+ else -> mContext.getString(R.string.fairy_legend_call)
+ }
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeFairyResultAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeFairyResultAdapter.kt
new file mode 100644
index 000000000..7576b9af5
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ExchangeFairyResultAdapter.kt
@@ -0,0 +1,17 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.ImageLoadUtilsV2
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+
+class ExchangeFairyResultAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_forest_prize_single) {
+
+ override fun convert(helper: BaseViewHolder, item: ExchangeGiftInfo) {
+ ImageLoadUtilsV2.loadImage(helper.getView(R.id.iv_prize_icon), item.rewardPicUrl)
+ helper.setText(R.id.tv_prize_name, item.rewardName)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestIndicatorAdapter.java b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestIndicatorAdapter.java
new file mode 100644
index 000000000..fbfa9b954
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestIndicatorAdapter.java
@@ -0,0 +1,96 @@
+package com.yizhuan.erban.treasurefairy.adapter;
+
+import android.content.Context;
+import android.graphics.Color;
+import android.view.Gravity;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+import android.widget.TextView;
+
+import androidx.core.content.ContextCompat;
+
+import com.yizhuan.erban.R;
+import com.yizhuan.erban.ui.widget.XRecyclerView.ScaleTransitionPagerTitleView;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.UIUtil;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.CommonNavigatorAdapter;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerIndicator;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.abs.IPagerTitleView;
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.indicators.LinePagerIndicator;
+
+import java.util.List;
+
+public class ForestIndicatorAdapter extends CommonNavigatorAdapter {
+ private final Context mContext;
+ private final List extends CharSequence> mTitleList;
+
+ private int textSize = 15;
+ private float minScale = 1f;
+ private OnItemSelectListener mOnItemSelectListener;
+
+ public ForestIndicatorAdapter(Context context, List extends CharSequence> charSequences) {
+ this.mContext = context;
+ this.mTitleList = charSequences;
+ }
+
+ @Override
+ public int getCount() {
+ return mTitleList == null ? 0 : mTitleList.size();
+ }
+
+ @Override
+ public IPagerTitleView getTitleView(Context context, final int i) {
+ ScaleTransitionPagerTitleView scaleTransitionPagerTitleView = new ScaleTransitionPagerTitleView(context, true);
+ scaleTransitionPagerTitleView.setNormalColor(ContextCompat.getColor(context, R.color.white));
+ scaleTransitionPagerTitleView.setSelectedColor(ContextCompat.getColor(context, R.color.white));
+ scaleTransitionPagerTitleView.setMinScale(minScale);
+ scaleTransitionPagerTitleView.setTextSize(textSize);
+ int padding = UIUtil.dip2px(context, 12);
+ scaleTransitionPagerTitleView.setPadding(padding, 0, padding, 0);
+ scaleTransitionPagerTitleView.setText(mTitleList.get(i));
+ scaleTransitionPagerTitleView.setOnClickListener(view -> {
+ if (mOnItemSelectListener != null) {
+ mOnItemSelectListener.onItemSelect(i, scaleTransitionPagerTitleView);
+ }
+
+ });
+ return scaleTransitionPagerTitleView;
+ }
+
+ @Override
+ public IPagerIndicator getIndicator(Context context) {
+ LinePagerIndicator indicator = new LinePagerIndicator(context);
+ indicator.setMode(LinePagerIndicator.MODE_EXACTLY);
+ indicator.setLineHeight(UIUtil.dip2px(mContext, 4));
+ indicator.setRoundRadius(UIUtil.dip2px(mContext, 2));
+ indicator.setLineWidth(UIUtil.dip2px(mContext, 60));
+ indicator.setColors(Color.parseColor("#69FFEB"),Color.parseColor("#EAFF89"));
+ FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+ lp.gravity = Gravity.BOTTOM;
+ indicator.setLayoutParams(lp);
+ return indicator;
+ }
+
+ public int getTextSize() {
+ return textSize;
+ }
+
+ public void setTextSize(int textSize) {
+ this.textSize = textSize;
+ }
+
+ public float getMinScale() {
+ return minScale;
+ }
+
+ public void setMinScale(float minScale) {
+ this.minScale = minScale;
+ }
+
+ public void setOnItemSelectListener(OnItemSelectListener onItemSelectListener) {
+ mOnItemSelectListener = onItemSelectListener;
+ }
+
+ public interface OnItemSelectListener {
+ void onItemSelect(int position, TextView view);
+ }
+}
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizeAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizeAdapter.kt
new file mode 100644
index 000000000..59e652a2e
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizeAdapter.kt
@@ -0,0 +1,24 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class ForestPrizeAdapter(val isSingle: Boolean = false) :
+ BaseQuickAdapter(
+ if (isSingle) {
+ R.layout.treasure_fairy_item_forest_prize_single
+ } else {
+ R.layout.treasure_fairy_item_forest_prize
+ }
+ ) {
+
+ override fun convert(helper: BaseViewHolder, item: PrizeInfo) {
+ helper.getView(R.id.iv_prize_icon).load(item.rewardPicUrl)
+ helper.setText(R.id.tv_prize_name, "${item.rewardName}x${item.rewardNum}")
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizesChildAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizesChildAdapter.kt
new file mode 100644
index 000000000..063c87631
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizesChildAdapter.kt
@@ -0,0 +1,18 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class ForestPrizesChildAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_forest_prizes_child) {
+
+ override fun convert(helper: BaseViewHolder, item: PrizeInfo) {
+ helper.getView(R.id.iv_prize_icon).load(item.rewardPicUrl)
+ helper.setText(R.id.tv_prize_name, item.rewardName)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizesRecordAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizesRecordAdapter.kt
new file mode 100644
index 000000000..6c8e10c56
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/ForestPrizesRecordAdapter.kt
@@ -0,0 +1,30 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+import java.text.SimpleDateFormat
+import java.util.*
+
+class ForestPrizesRecordAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_forest_prizes_record) {
+
+ private val formatYear = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA)
+ private val formatHour = SimpleDateFormat("HH:mm:ss", Locale.CHINA)
+
+ override fun convert(helper: BaseViewHolder, item: PrizeInfo) {
+
+ helper.setText(R.id.tv_time_year, formatYear.format(item.drawTime))
+ helper.setText(R.id.tv_time_hour, formatHour.format(item.drawTime))
+ helper.setText(R.id.tv_prize_name, "${item.rewardName}x${item.rewardNum}")
+ helper.setText(
+ R.id.tv_prize_type, when (item.poolLevel) {
+ 1 -> mContext.getString(R.string.fairy_primary_forest)
+ 2 -> mContext.getString(R.string.fairy_epic_forest)
+ else -> mContext.getString(R.string.fairy_legend_forest)
+ }
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/HomePrizeAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/HomePrizeAdapter.kt
new file mode 100644
index 000000000..bdf9db6cb
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/HomePrizeAdapter.kt
@@ -0,0 +1,25 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class HomePrizeAdapter(val isSingle: Boolean = false) :
+ BaseQuickAdapter(
+ if (isSingle) {
+ R.layout.treasure_fairy_item_home_prize_single
+ } else {
+ R.layout.treasure_fairy_item_home_prize
+ }
+ ) {
+
+ override fun convert(helper: BaseViewHolder, item: PrizeInfo) {
+ helper.getView(R.id.iv_prize_icon).load(item.rewardPicUrl)
+ helper.setText(R.id.tv_prize_num, "x${item.rewardNum}")
+ helper.setText(R.id.tv_prize_name, item.rewardName)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/MyFairyFriendsAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/MyFairyFriendsAdapter.kt
new file mode 100644
index 000000000..15cff452a
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/MyFairyFriendsAdapter.kt
@@ -0,0 +1,20 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.gift.bean.SimpleUserInfo
+import com.yizhuan.xchat_android_core.utils.ifNullOrEmpty
+
+class MyFairyFriendsAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_my_fairy_friend) {
+
+ override fun convert(helper: BaseViewHolder, item: SimpleUserInfo) {
+ helper.getView(R.id.iv_avatar).load(item.avatar)
+ helper.setText(R.id.tv_nickname, item.nick)
+ helper.setText(R.id.tv_desc, item.userDesc.ifNullOrEmpty { mContext.getString(R.string.fairy_default_signature) })
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/MyFairyRecordAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/MyFairyRecordAdapter.kt
new file mode 100644
index 000000000..59839e9ee
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/MyFairyRecordAdapter.kt
@@ -0,0 +1,27 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.SendFairyInfo
+import java.text.SimpleDateFormat
+import java.util.*
+
+class MyFairyRecordAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_my_fairy_record) {
+
+ private val format = SimpleDateFormat("yyyy年MM月dd日 HH時mm分ss秒", Locale.CHINA)
+
+ override fun convert(helper: BaseViewHolder, item: SendFairyInfo) {
+ helper.getView(R.id.iv_fairy_icon).load(item.elfPicUrl)
+ helper.setText(R.id.tv_record_time, format.format(item.createTime))
+ val isSend = item.type == 2
+ helper.setText(
+ R.id.tv_content,
+ "${if (isSend) "你" else item.targetNick}贈送${if (isSend) "" else "了你"}一張“${item.elfName}”精靈卡"
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyAdapter.kt
new file mode 100644
index 000000000..c175545a5
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyAdapter.kt
@@ -0,0 +1,25 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+import java.util.*
+
+class TestFairyAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_test_fairy) {
+
+
+ override fun convert(helper: BaseViewHolder, item: FairyInfo) {
+ helper.getView(R.id.iv_fairy_icon).load(item.elfPicUrl)
+ helper.setText(R.id.tv_fairy_num, "${item.selectedNum}/${item.elfNum}")
+ helper.setText(R.id.tv_fairy_name, item.elfName)
+ helper.setBackgroundRes(
+ R.id.ll_root,
+ if (item.selectedNum > 0) R.drawable.treasure_fairy_bg_test_fairy_item_select else 0
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyRecordAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyRecordAdapter.kt
new file mode 100644
index 000000000..f182b4582
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyRecordAdapter.kt
@@ -0,0 +1,33 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.xchat_android_core.treasurefairy.TestFairyRecordInfo
+import java.text.SimpleDateFormat
+import java.util.*
+
+class TestFairyRecordAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_test_fairy_record) {
+
+ private val formatYear = SimpleDateFormat("yyyy-MM-dd", Locale.CHINA)
+ private val formatHour = SimpleDateFormat("HH:mm:ss", Locale.CHINA)
+
+ override fun convert(helper: BaseViewHolder, item: TestFairyRecordInfo) {
+
+ helper.setText(R.id.tv_time_year, formatYear.format(item.createTime))
+ helper.setText(R.id.tv_time_hour, formatHour.format(item.createTime))
+ helper.setText(R.id.tv_prize_name, item.elfName)
+ helper.setText(
+ R.id.tv_prize_type, when (item.elfLevel) {
+ 2 -> "史詩試煉"
+ else -> "傳說試煉"
+ }
+ )
+
+ helper.setText(
+ R.id.tv_fairy_infos,
+ item.expendList.joinToString(separator = "\n") { "${it.elfName}x${it.elfNum}" })
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyResultAdapter.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyResultAdapter.kt
new file mode 100644
index 000000000..174132203
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/adapter/TestFairyResultAdapter.kt
@@ -0,0 +1,18 @@
+package com.yizhuan.erban.treasurefairy.adapter
+
+import android.widget.ImageView
+import com.chad.library.adapter.base.BaseQuickAdapter
+import com.chad.library.adapter.base.BaseViewHolder
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+
+class TestFairyResultAdapter :
+ BaseQuickAdapter(R.layout.treasure_fairy_item_forest_prize_single) {
+
+ override fun convert(helper: BaseViewHolder, item: FairyInfo) {
+ helper.getView(R.id.iv_prize_icon).load(item.elfPicUrl)
+ helper.setText(R.id.tv_prize_name, item.elfName)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeFairyDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeFairyDialog.kt
new file mode 100644
index 000000000..3aa8d107d
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeFairyDialog.kt
@@ -0,0 +1,67 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.fragment.app.activityViewModels
+import androidx.viewpager.widget.ViewPager
+import com.yizhuan.erban.R
+import com.yizhuan.erban.avroom.adapter.RoomVPAdapter
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogExchangeBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.fragment.ExchangeDebrisFragment
+import com.yizhuan.erban.treasurefairy.fragment.ExchangeFairyFragment
+
+class ExchangeFairyDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.BOTTOM
+
+ companion object {
+ fun newInstance(): ExchangeFairyDialog {
+ val args = Bundle()
+ val fragment = ExchangeFairyDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.ivBack.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ binding.tvRecord.setOnClickListener {
+ ExchangeRecordDialog.newInstance().show(context)
+ }
+ binding.rg.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.rb_epic -> binding.viewPager.currentItem = 0
+ R.id.rb_legend -> binding.viewPager.currentItem = 1
+ }
+ }
+ binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
+ override fun onPageSelected(position: Int) {
+ when (position) {
+ 0 -> binding.rg.check(R.id.rb_epic)
+ 1 -> binding.rg.check(R.id.rb_legend)
+ }
+ }
+ })
+
+ binding.viewPager.adapter = RoomVPAdapter(
+ childFragmentManager,
+ listOf(
+ ExchangeFairyFragment.newInstance(),
+ ExchangeDebrisFragment.newInstance()
+ )
+ )
+ viewModel.getMyFairyInfo()
+ viewModel.cleanTestParam()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeFairyResultDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeFairyResultDialog.kt
new file mode 100644
index 000000000..1f375567f
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeFairyResultDialog.kt
@@ -0,0 +1,59 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogTestFairyResultBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.ExchangeFairyResultAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+
+class ExchangeFairyResultDialog : BaseDialog() {
+
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: ExchangeFairyResultAdapter
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var height = WindowManager.LayoutParams.WRAP_CONTENT
+ override var gravity = Gravity.CENTER
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ companion object {
+ fun newInstance(): ExchangeFairyResultDialog {
+ val args = Bundle()
+ val fragment = ExchangeFairyResultDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.tvClose.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ val prizeInfoList = viewModel.exchangeGiftLiveData.value
+ if (prizeInfoList == null) {
+ dismissAllowingStateLoss()
+ return
+ }
+
+ prizeAdapter = ExchangeFairyResultAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(
+ LinearLayoutManager(context)
+ )
+ .build()
+
+ rvDelegate.setNewData(arrayListOf(prizeInfoList.peekContent()))
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeRecordDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeRecordDialog.kt
new file mode 100644
index 000000000..c0a84580b
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ExchangeRecordDialog.kt
@@ -0,0 +1,59 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.viewpager.widget.ViewPager
+import com.yizhuan.erban.R
+import com.yizhuan.erban.avroom.adapter.RoomVPAdapter
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogExchangeRecordBinding
+import com.yizhuan.erban.treasurefairy.fragment.ExchangeDebrisRecordFragment
+import com.yizhuan.erban.treasurefairy.fragment.ExchangeFairyRecordFragment
+
+class ExchangeRecordDialog : BaseDialog() {
+
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var height = WindowManager.LayoutParams.WRAP_CONTENT
+ override var gravity = Gravity.CENTER
+
+ companion object {
+ fun newInstance(): ExchangeRecordDialog {
+ val args = Bundle()
+ val fragment = ExchangeRecordDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.rootView.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ binding.rg.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.rb_prizes -> binding.viewPager.currentItem = 0
+ R.id.rb_record -> binding.viewPager.currentItem = 1
+ }
+ }
+ binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
+ override fun onPageSelected(position: Int) {
+ when (position) {
+ 0 -> binding.rg.check(R.id.rb_prizes)
+ 1 -> binding.rg.check(R.id.rb_record)
+ }
+ }
+ })
+ binding.viewPager.adapter = RoomVPAdapter(
+ childFragmentManager,
+ listOf(
+ ExchangeFairyRecordFragment.newInstance(),
+ ExchangeDebrisRecordFragment.newInstance()
+ )
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestFairyDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestFairyDialog.kt
new file mode 100644
index 000000000..967a94c96
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestFairyDialog.kt
@@ -0,0 +1,176 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.core.view.isInvisible
+import androidx.fragment.app.activityViewModels
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogForestBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.ui.utils.loadAvatar
+import com.yizhuan.xchat_android_core.utils.subAndReplaceDot
+import com.yizhuan.xchat_android_core.utils.toIntOrDef
+import com.yizhuan.xchat_android_core.utils.toast
+
+class ForestFairyDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.BOTTOM
+ private val viewModel: FairyViewModel by activityViewModels()
+ private var currentType = 1
+
+ private val showResultRunnable = Runnable {
+ if (canShowResult) {
+ canShowResult = false
+ enabledOpenBtn(true)
+ ForestPrizeDialog.newInstance().show(context)
+ } else {
+ resultNotShowed = true
+ }
+ }
+ private var canShowResult = false
+ private var resultNotShowed = false
+
+ companion object {
+ fun newInstance(): ForestFairyDialog {
+ val args = Bundle()
+ val fragment = ForestFairyDialog()
+ fragment.arguments = args
+ return fragment
+ }
+
+ const val BASE = 1
+ const val EPIC = 2
+ const val LEGEND = 3
+ }
+
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.ivBack.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ binding.ivRecord.setOnClickListener {
+ ForestRecordDialog.newInstance().show(context)
+ }
+ binding.ivMyFairy.setOnClickListener {
+ MyFairyDialog.newInstance().show(context)
+ }
+ binding.ivFairyTest.setOnClickListener {
+ TestFairyDialog.newInstance().show(context)
+ }
+ binding.ivFairyStore.setOnClickListener {
+ ExchangeFairyDialog.newInstance().show(context)
+ }
+
+ binding.ivPrevious.setOnClickListener {
+ currentType--
+ switchType()
+ }
+ binding.ivNext.setOnClickListener {
+ currentType++
+ switchType()
+ }
+ binding.viewBgGrab1.setOnClickListener {
+ if (checkBallNum(1)) {
+ enabledOpenBtn(false)
+ binding.animView.startPlay(requireContext().assets, "vap/fairy_anim_once.mp4")
+ binding.animView.postDelayed(showResultRunnable, 1900)
+ viewModel.drawForestFairy(1, currentType)
+ }
+ }
+
+ binding.viewBgGrab10.setOnClickListener {
+ if (checkBallNum(10)) {
+ enabledOpenBtn(false)
+ binding.animView.startPlay(requireContext().assets, "vap/fairy_anim_ten.mp4")
+ binding.animView.postDelayed(showResultRunnable, 1900)
+ viewModel.drawForestFairy(10, currentType)
+ }
+ }
+
+ binding.animView.setOnClickListener {
+ if (canShowResult) {
+ binding.animView.removeCallbacks(showResultRunnable)
+ showResultRunnable.run()
+ }
+ }
+
+ viewModel.drawForestLiveData.observe(viewLifecycleOwner) {
+ it?.getContentIfNotHandled()?.let {
+ canShowResult = true
+ if (resultNotShowed) {
+ showResultRunnable.run()
+ }
+ } ?: run {
+ enabledOpenBtn(true)
+ }
+ }
+
+ viewModel.getForestInfo()
+
+ viewModel.forestInfoLiveData.observe(viewLifecycleOwner) {
+ it?.let {
+ binding.ivAvatar.loadAvatar(it.avatar)
+ binding.tvNickname.text = it.nick.subAndReplaceDot(7)
+ binding.tvKeyNumBase.text = it.lowBallNum
+ binding.tvKeyNumEpic.text = it.middleBallNum
+ binding.tvKeyNumLegend.text = it.highBallNum
+ }
+ }
+
+ }
+
+ private fun checkBallNum(openNum: Int): Boolean {
+ val ballNum = viewModel.forestInfoLiveData.value?.let {
+ when (currentType) {
+ BASE -> it.lowBallNum.toIntOrDef(0)
+ EPIC -> it.middleBallNum.toIntOrDef(0)
+ else -> it.highBallNum.toIntOrDef(0)
+ }
+ } ?: 0
+ return if (ballNum >= openNum) {
+ true
+ } else {
+ "精靈球數量不足".toast()
+ false
+ }
+ }
+
+ private fun enabledOpenBtn(enable: Boolean) {
+ binding.viewBgGrab1.isEnabled = enable
+ binding.viewBgGrab10.isEnabled = enable
+ }
+
+ @SuppressLint("SetTextI18n")
+ private fun switchType() {
+ when (currentType) {
+ BASE -> {
+ binding.ivPrevious.isInvisible = true
+ binding.tvGrabText1.text = "(初級球X1)"
+ binding.tvGrabText10.text = "(初級球X10)"
+ binding.tvTips.text = "使用初級球有一定幾率抓到初級精靈"
+ binding.viewBgForestBase.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_base)
+ }
+ EPIC -> {
+ binding.ivNext.isInvisible = false
+ binding.ivPrevious.isInvisible = false
+ binding.tvGrabText1.text = "(超級球X1)"
+ binding.tvGrabText10.text = "(超級球X10)"
+ binding.tvTips.text = "使用超級球有一定幾率抓到史詩精靈"
+ binding.viewBgForestBase.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_epic)
+ }
+ LEGEND -> {
+ binding.ivNext.isInvisible = true
+ binding.tvGrabText1.text = "(大師球X1)"
+ binding.tvGrabText10.text = "(大師球X10)"
+ binding.tvTips.text = "使用大師球必定抓到傳說精靈"
+ binding.viewBgForestBase.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_legend)
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestPrizeDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestPrizeDialog.kt
new file mode 100644
index 000000000..0d424f5d2
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestPrizeDialog.kt
@@ -0,0 +1,86 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.core.view.updateLayoutParams
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.netease.nim.uikit.common.util.sys.ScreenUtil
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogForestPrizeBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.ForestPrizeAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class ForestPrizeDialog : BaseDialog() {
+
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: ForestPrizeAdapter
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var height = WindowManager.LayoutParams.WRAP_CONTENT
+ override var gravity = Gravity.CENTER
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ companion object {
+ fun newInstance(isFairy: Boolean = false): ForestPrizeDialog {
+ val args = Bundle()
+ args.putBoolean("isFairy", isFairy)
+ val fragment = ForestPrizeDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.tvClose.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ val prizeInfoList = viewModel.drawForestLiveData.value?.peekContent()
+ if (prizeInfoList.isNullOrEmpty()) return
+ val isSingle = prizeInfoList.size == 1
+ val hasSurprise = prizeInfoList.find { it.propType == 1 } != null
+ val isFairy =
+ requireArguments().getBoolean("isFairy", true) || !hasSurprise
+ if (isFairy) {
+ viewModel.cleanDrawForestLiveData()
+ }
+ binding.tvTitle.text = if (isFairy) "恭喜獲得" else "意外發現"
+ if (!isFairy && !isSingle && hasSurprise) {
+ newInstance(true).show(context)
+ }
+
+ val showPrizeInfoList =
+ prizeInfoList.filter { if (isFairy) (it.propType != 1) else (it.propType == 1) }
+ val isShowDateSingle = showPrizeInfoList.size == 1
+ if (!isShowDateSingle) {
+ binding.viewBg.updateLayoutParams {
+ width = ScreenUtil.dip2px(318f)
+ height = ScreenUtil.dip2px(383f)
+ }
+ binding.viewBg.setBackgroundResource(R.drawable.treasure_fairy_bg_forest_prize)
+ }
+ prizeAdapter = ForestPrizeAdapter(isShowDateSingle)
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(
+ if (isShowDateSingle) {
+ LinearLayoutManager(context)
+ } else {
+ GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false)
+ }
+ )
+ .build()
+
+ rvDelegate.setNewData(showPrizeInfoList)
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestRecordDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestRecordDialog.kt
new file mode 100644
index 000000000..4c5622677
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/ForestRecordDialog.kt
@@ -0,0 +1,59 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.viewpager.widget.ViewPager
+import com.yizhuan.erban.R
+import com.yizhuan.erban.avroom.adapter.RoomVPAdapter
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogForestRecordBinding
+import com.yizhuan.erban.treasurefairy.fragment.ForestPrizesFragment
+import com.yizhuan.erban.treasurefairy.fragment.ForestRecordFragment
+
+class ForestRecordDialog : BaseDialog() {
+
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var height = WindowManager.LayoutParams.WRAP_CONTENT
+ override var gravity = Gravity.CENTER
+
+ companion object {
+ fun newInstance(): ForestRecordDialog {
+ val args = Bundle()
+ val fragment = ForestRecordDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.rootView.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ binding.rg.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.rb_prizes -> binding.viewPager.currentItem = 0
+ R.id.rb_record -> binding.viewPager.currentItem = 1
+ }
+ }
+ binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
+ override fun onPageSelected(position: Int) {
+ when (position) {
+ 0 -> binding.rg.check(R.id.rb_prizes)
+ 1 -> binding.rg.check(R.id.rb_record)
+ }
+ }
+ })
+ binding.viewPager.adapter = RoomVPAdapter(
+ childFragmentManager,
+ listOf(
+ ForestPrizesFragment.newInstance(),
+ ForestRecordFragment.newInstance(),
+ )
+ )
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/HomeMorePopupWindow.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/HomeMorePopupWindow.kt
new file mode 100644
index 000000000..cba2f42d7
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/HomeMorePopupWindow.kt
@@ -0,0 +1,37 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.content.Context
+import android.graphics.Color
+import android.view.View
+import com.yizhuan.erban.R
+import com.yizhuan.erban.ui.webview.FairyDialogWebViewActivity
+import com.yizhuan.xchat_android_core.UriProvider
+import razerdp.basepopup.BasePopupWindow
+
+class HomeMorePopupWindow(private val context: Context) : BasePopupWindow(context) {
+
+ init {
+ contentView = createPopupById(R.layout.treasure_fairy_popup_window_home_more)
+ setOutSideDismiss(true)
+ setBackgroundColor(Color.TRANSPARENT)
+ setPopupAnimationStyle(-1)
+ findViewById(R.id.tv_rule).setOnClickListener {
+ FairyDialogWebViewActivity.start(context, UriProvider.getFairyRule())
+ dismiss()
+ }
+ findViewById(R.id.tv_record).setOnClickListener {
+ FairyDialogWebViewActivity.start(context, UriProvider.getFairyRecord())
+ dismiss()
+ }
+ findViewById(R.id.tv_rank).setOnClickListener {
+ FairyDialogWebViewActivity.start(context, UriProvider.getFairySuperior())
+ dismiss()
+ }
+ }
+
+ fun show(anchor: View?, popupGravity: Int) {
+ setPopupGravity(popupGravity)
+ showPopupWindow(anchor)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/HomePrizeDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/HomePrizeDialog.kt
new file mode 100644
index 000000000..589b39457
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/HomePrizeDialog.kt
@@ -0,0 +1,58 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogHomePrizeBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.HomePrizeAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class HomePrizeDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.BOTTOM
+
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: HomePrizeAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ companion object {
+ fun newInstance(): HomePrizeDialog {
+ val args = Bundle()
+ val fragment = HomePrizeDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.rootView.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ val prizeInfoList = viewModel.resultLiveData.value?.peekContent()
+ if (prizeInfoList.isNullOrEmpty()) return
+ val isSingle = prizeInfoList.size == 1
+ prizeAdapter = HomePrizeAdapter(isSingle)
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(
+ if (isSingle) {
+ LinearLayoutManager(context)
+ } else {
+ GridLayoutManager(context, 4, LinearLayoutManager.VERTICAL, false)
+ }
+ )
+ .build()
+ rvDelegate.setNewData(prizeInfoList)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairyDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairyDialog.kt
new file mode 100644
index 000000000..53b39f1c6
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairyDialog.kt
@@ -0,0 +1,73 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.fragment.app.activityViewModels
+import androidx.viewpager.widget.ViewPager
+import com.yizhuan.erban.R
+import com.yizhuan.erban.avroom.adapter.RoomVPAdapter
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogMyFairyBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.fragment.MyFairyFragment
+import com.yizhuan.erban.treasurefairy.view.MyFairyItemView
+import com.yizhuan.xchat_android_core.DemoCache
+
+class MyFairyDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.BOTTOM
+
+ companion object {
+ fun newInstance(): MyFairyDialog {
+ val args = Bundle()
+ val fragment = MyFairyDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.ivBack.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ binding.ivRecord.setOnClickListener {
+ MyFairyRecordDialog.newInstance().show(context)
+ }
+ binding.rg.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.rb_base -> binding.viewPager.currentItem = 0
+ R.id.rb_epic -> binding.viewPager.currentItem = 1
+ R.id.rb_legend -> binding.viewPager.currentItem = 2
+ }
+ }
+ binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
+ override fun onPageSelected(position: Int) {
+ when (position) {
+ 0 -> binding.rg.check(R.id.rb_base)
+ 1 -> binding.rg.check(R.id.rb_epic)
+ 2 -> binding.rg.check(R.id.rb_legend)
+ }
+ DemoCache.saveMyFairyIndex(position)
+ }
+ })
+ binding.viewPager.adapter = RoomVPAdapter(
+ childFragmentManager,
+ listOf(
+ MyFairyFragment.newInstance(MyFairyItemView.BASE),
+ MyFairyFragment.newInstance(MyFairyItemView.EPIC),
+ MyFairyFragment.newInstance(MyFairyItemView.LEGEND)
+ )
+ )
+
+ binding.viewPager.setCurrentItem(DemoCache.readMyFairyIndex(), false)
+
+ viewModel.getMyFairyInfo()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairyRecordDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairyRecordDialog.kt
new file mode 100644
index 000000000..50dac2b57
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairyRecordDialog.kt
@@ -0,0 +1,62 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyDialogMyFairyRecordBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.MyFairyRecordAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.SendFairyInfo
+
+class MyFairyRecordDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.CENTER
+
+ companion object {
+ fun newInstance(): MyFairyRecordDialog {
+ val args = Bundle()
+ val fragment = MyFairyRecordDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private var page = 1
+ private val pageSize = 20
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var recordAdapter: MyFairyRecordAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+
+ recordAdapter = MyFairyRecordAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(recordAdapter)
+ .setRecyclerView(binding.recyclerView)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無記錄"))
+ .setLayoutManager(LinearLayoutManager(context))
+ .build()
+
+ viewModel.sendFairyRecordLiveData.observe(viewLifecycleOwner) {
+ rvDelegate.loadData(it)
+ }
+
+ recordAdapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
+
+ loadData(true)
+ }
+
+ private fun loadData(isRefresh: Boolean) {
+ page = if (isRefresh) 1 else (page + 1)
+ viewModel.getSendFairyList(page, pageSize)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairySearchFriendsDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairySearchFriendsDialog.kt
new file mode 100644
index 000000000..ee922dd07
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairySearchFriendsDialog.kt
@@ -0,0 +1,62 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.core.widget.doAfterTextChanged
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogMyFairySearchFriendBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.MyFairyFriendsAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.gift.bean.SimpleUserInfo
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+
+class MyFairySearchFriendsDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.BOTTOM
+
+ companion object {
+ fun newInstance(fairyInfo: FairyInfo, isSend: Boolean): MyFairySearchFriendsDialog {
+ val args = Bundle()
+ args.putSerializable("fairyInfo", fairyInfo)
+ args.putBoolean("isSend", isSend)
+ val fragment = MyFairySearchFriendsDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var friendsAdapter: MyFairyFriendsAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.ivBack.setOnClickListener { dismissAllowingStateLoss() }
+ friendsAdapter = MyFairyFriendsAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(friendsAdapter)
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(LinearLayoutManager(context))
+ .build()
+ friendsAdapter.setOnItemClickListener { _, _, position ->
+ friendsAdapter.getItem(position)?.let {
+ MyFairySendDialog.newInstance(requireArguments(), it).show(context)
+ }
+ }
+ viewModel.getFriendsList()
+ viewModel.friendsListLiveData.observe(viewLifecycleOwner) {
+ rvDelegate.setNewData(it)
+ }
+ binding.editSearch.doAfterTextChanged {
+ viewModel.getFriendsList(it?.toString())
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairySendDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairySendDialog.kt
new file mode 100644
index 000000000..bd8360929
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/MyFairySendDialog.kt
@@ -0,0 +1,79 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.graphics.Color
+import android.os.Bundle
+import android.text.style.ForegroundColorSpan
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.core.graphics.toColorInt
+import androidx.fragment.app.activityViewModels
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogMyFairySendBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.erban.utils.SpannableBuilder
+import com.yizhuan.xchat_android_core.gift.bean.SimpleUserInfo
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+
+class MyFairySendDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.CENTER
+ private var onSendListener: (() -> Unit)? = null
+
+ companion object {
+ fun newInstance(bundle: Bundle, userInfo: SimpleUserInfo): MyFairySendDialog {
+ val args = Bundle()
+ args.putSerializable("userInfo", userInfo)
+ args.putAll(bundle)
+ val fragment = MyFairySendDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val viewModel: FairyViewModel by activityViewModels()
+ private val userInfo by lazy { requireArguments().getSerializable("userInfo") as SimpleUserInfo }
+ private val fairyInfo by lazy { requireArguments().getSerializable("fairyInfo") as FairyInfo }
+ private val isSend by lazy { requireArguments().getBoolean("isSend") }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+
+ binding.ivFairyIcon.load(fairyInfo.elfPicUrl)
+ binding.tvContent.text =
+ SpannableBuilder()
+ .append(if (isSend) "確定贈送”" else "確定向", ForegroundColorSpan(Color.WHITE))
+ .append("${userInfo.nick}", ForegroundColorSpan("#FEF8AA".toColorInt()))
+ .append(
+ "”${if (isSend) "" else "索要"}1張“${fairyInfo.elfName}”精靈卡嗎?",
+ ForegroundColorSpan(Color.WHITE)
+ )
+ .build()
+ binding.tvSend.text = if (isSend) "贈 送" else "索 要"
+ binding.tvClose.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ binding.tvSend.setOnClickListener {
+ if (isSend) {
+ viewModel.sendFairy(fairyInfo.elfId, userInfo.uid)
+ } else {
+ viewModel.askForFairy(fairyInfo.elfId, userInfo.uid)
+ }
+ }
+
+ viewModel.sendFairyLiveData.observe(viewLifecycleOwner) {
+ if (it.getContentIfNotHandled() == true) {
+ dismissAllowingStateLoss()
+ onSendListener?.invoke()
+ }
+ }
+ }
+
+ fun setOnSendListener(onSendListener: () -> Nothing) {
+ this.onSendListener = onSendListener
+ }
+
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyDialog.kt
new file mode 100644
index 000000000..67063a2a6
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyDialog.kt
@@ -0,0 +1,68 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.fragment.app.activityViewModels
+import androidx.viewpager.widget.ViewPager
+import com.yizhuan.erban.R
+import com.yizhuan.erban.avroom.adapter.RoomVPAdapter
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogTestFairyBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.fragment.TestFairyFragment
+import com.yizhuan.erban.treasurefairy.view.MyFairyItemView
+
+class TestFairyDialog : BaseDialog() {
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var gravity = Gravity.BOTTOM
+
+ companion object {
+ fun newInstance(): TestFairyDialog {
+ val args = Bundle()
+ val fragment = TestFairyDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.ivBack.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ binding.tvRecord.setOnClickListener {
+ TestFairyRecordDialog.newInstance().show(context)
+ }
+ binding.rg.setOnCheckedChangeListener { _, checkedId ->
+ when (checkedId) {
+ R.id.rb_epic -> binding.viewPager.currentItem = 0
+ R.id.rb_legend -> binding.viewPager.currentItem = 1
+ }
+ }
+ binding.viewPager.addOnPageChangeListener(object : ViewPager.SimpleOnPageChangeListener() {
+ override fun onPageSelected(position: Int) {
+ when (position) {
+ 0 -> binding.rg.check(R.id.rb_epic)
+ 1 -> binding.rg.check(R.id.rb_legend)
+ }
+ viewModel.cleanTestParam()
+ }
+ })
+
+ binding.viewPager.adapter = RoomVPAdapter(
+ childFragmentManager,
+ listOf(
+ TestFairyFragment.newInstance(MyFairyItemView.BASE),
+ TestFairyFragment.newInstance(MyFairyItemView.EPIC)
+ )
+ )
+ viewModel.getMyFairyInfo()
+ viewModel.cleanTestParam()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyRecordDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyRecordDialog.kt
new file mode 100644
index 000000000..f82c7d6f3
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyRecordDialog.kt
@@ -0,0 +1,61 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.netease.nim.uikit.common.util.sys.ScreenUtil
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyDialogTestFairyRecordBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.TestFairyRecordAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.TestFairyRecordInfo
+
+class TestFairyRecordDialog : BaseDialog() {
+
+
+ companion object {
+ fun newInstance(): TestFairyRecordDialog {
+ val args = Bundle()
+ val fragment = TestFairyRecordDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private var page = 1
+ private val pageSize = 20
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: TestFairyRecordAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+ override var width: Int = ScreenUtil.dip2px(318f)
+ override var height: Int = ScreenUtil.dip2px(388f)
+
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ prizeAdapter = TestFairyRecordAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setPageSize(pageSize)
+ .setRecyclerView(binding.recyclerView)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無數據"))
+ .setLayoutManager(LinearLayoutManager(context))
+ .build()
+
+ viewModel.testRecordLiveData.observe(viewLifecycleOwner) {
+ rvDelegate.loadData(it)
+ }
+
+ prizeAdapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
+
+ loadData(true)
+ }
+
+ private fun loadData(isRefresh: Boolean) {
+ page = if (isRefresh) 1 else (page + 1)
+ viewModel.getTestFairyRecordList(page, pageSize)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyResultDialog.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyResultDialog.kt
new file mode 100644
index 000000000..e295be3e7
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/dialog/TestFairyResultDialog.kt
@@ -0,0 +1,55 @@
+package com.yizhuan.erban.treasurefairy.dialog
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.view.Gravity
+import android.view.WindowManager
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseDialog
+import com.yizhuan.erban.databinding.TreasureFairyDialogTestFairyResultBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.TestFairyResultAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+
+class TestFairyResultDialog : BaseDialog() {
+
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: TestFairyResultAdapter
+
+ override var width = WindowManager.LayoutParams.MATCH_PARENT
+ override var height = WindowManager.LayoutParams.WRAP_CONTENT
+ override var gravity = Gravity.CENTER
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ companion object {
+ fun newInstance(fairyInfo: FairyInfo): TestFairyResultDialog {
+ val args = Bundle()
+ args.putSerializable("fairyInfo",fairyInfo)
+ val fragment = TestFairyResultDialog()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val fairyInfo by lazy { requireArguments().getSerializable("fairyInfo") as FairyInfo }
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.tvClose.setOnClickListener {
+ dismissAllowingStateLoss()
+ }
+ prizeAdapter = TestFairyResultAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(
+ LinearLayoutManager(context)
+ )
+ .build()
+
+ rvDelegate.setNewData(arrayListOf(fairyInfo))
+ viewModel.cleanTestParam()
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeDebrisFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeDebrisFragment.kt
new file mode 100644
index 000000000..dc2532b86
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeDebrisFragment.kt
@@ -0,0 +1,78 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyFragmentExchangeDebrisBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.ExchangeDebrisAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.erban.ui.utils.loadAvatar
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+import com.yizhuan.xchat_android_core.user.UserModel
+import com.yizhuan.xchat_android_core.utils.subAndReplaceDot
+import com.yizhuan.xchat_android_core.utils.toast
+
+class ExchangeDebrisFragment :
+ BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(): ExchangeDebrisFragment {
+ val args = Bundle()
+ val fragment = ExchangeDebrisFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val viewModel: FairyViewModel by activityViewModels()
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var debrisAdapter: ExchangeDebrisAdapter
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ debrisAdapter = ExchangeDebrisAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(debrisAdapter)
+ .setRecyclerView(binding.recyclerView)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無數據"))
+ .setLayoutManager(GridLayoutManager(context, 2, LinearLayoutManager.VERTICAL, false))
+ .build()
+ viewModel.getDebrisExchangeList()
+ viewModel.debrisExchangeListLiveData.observe(viewLifecycleOwner) {
+ rvDelegate.setNewData(it)
+ }
+ debrisAdapter.setOnItemChildClickListener { _, _, position ->
+ debrisAdapter.getItem(position)?.let {
+ dialogManager.showTipsDialog("您將要兌換“${it.getPrizeName()}”", "兌換") {
+ viewModel.debrisExchange(it.itemId)
+ }
+ }
+ }
+
+ viewModel.getMyFairyInfo()
+
+ viewModel.myFairyInfoLiveData.observe(viewLifecycleOwner) {
+ it?.let {
+ binding.tvDebrisNum.text = it.chipNum.toString()
+ }
+ }
+
+ UserModel.get().cacheLoginUserInfo?.let {
+ binding.ivAvatar.loadAvatar(it.avatar)
+ binding.tvNickname.text = it.nick.subAndReplaceDot(7)
+ }
+
+ viewModel.debrisExchangeLiveData.observe(viewLifecycleOwner) {
+ it?.getContentIfNotHandled()?.let {
+ "兌換成功~".toast()
+ }
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeDebrisRecordFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeDebrisRecordFragment.kt
new file mode 100644
index 000000000..f2a4c56a8
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeDebrisRecordFragment.kt
@@ -0,0 +1,58 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyFragmentExchangeRecordDebrisBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.ExchangeDebrisRecordAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+
+class ExchangeDebrisRecordFragment : BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(): ExchangeDebrisRecordFragment {
+ val args = Bundle()
+ val fragment = ExchangeDebrisRecordFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private var page = 1
+ private val pageSize = 20
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: ExchangeDebrisRecordAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ prizeAdapter = ExchangeDebrisRecordAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setPageSize(pageSize)
+ .setRecyclerView(binding.recyclerView)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無數據"))
+ .setLayoutManager(LinearLayoutManager(context))
+ .build()
+
+ viewModel.exchangeDebrisRecordLiveData.observe(viewLifecycleOwner) {
+ rvDelegate.loadData(it)
+ }
+
+ prizeAdapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
+
+ loadData(true)
+ }
+
+ private fun loadData(isRefresh: Boolean) {
+ page = if (isRefresh) 1 else (page + 1)
+ viewModel.getExchangeDebrisRecord(page, pageSize)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeFairyFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeFairyFragment.kt
new file mode 100644
index 000000000..6ca68ad99
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeFairyFragment.kt
@@ -0,0 +1,128 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.core.view.isInvisible
+import androidx.fragment.app.activityViewModels
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.databinding.TreasureFairyFragmentExchangeFairyBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.dialog.ExchangeFairyResultDialog
+import com.yizhuan.erban.treasurefairy.view.MyFairyItemView
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+import com.yizhuan.xchat_android_core.treasurefairy.MyFairyInfo
+
+class ExchangeFairyFragment : BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(): ExchangeFairyFragment {
+ val args = Bundle()
+ val fragment = ExchangeFairyFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val viewModel: FairyViewModel by activityViewModels()
+ private var fairyType = MyFairyItemView.BASE
+ private val fairyItems by lazy {
+ arrayListOf(
+ binding.fairyItem0,
+ binding.fairyItem1,
+ binding.fairyItem2,
+ binding.fairyItem3,
+ binding.fairyItem4
+ )
+ }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ binding.ivPrevious.setOnClickListener {
+ fairyType--
+ switchLevel()
+ }
+ binding.ivNext.setOnClickListener {
+ fairyType++
+ switchLevel()
+ }
+
+ binding.ivCompound.isEnabled = false
+
+ viewModel.getMyFairyInfo()
+
+ viewModel.getExchangeGiftInfoList()
+
+ viewModel.myFairyInfoLiveData.observe(viewLifecycleOwner) {
+ it?.let { setupMyFairyInfo(it) }
+ }
+
+ viewModel.exchangeGiftListLiveData.observe(viewLifecycleOwner) {
+ it?.let { setupExchangeGiftList(it) }
+ }
+
+ viewModel.exchangeGiftLiveData.observe(viewLifecycleOwner) {
+ it?.getContentIfNotHandled()?.let {
+ ExchangeFairyResultDialog.newInstance().show(context)
+ }
+ }
+
+ }
+
+ private fun switchLevel() {
+ viewModel.myFairyInfoLiveData.value?.let {
+ setupMyFairyInfo(it)
+ }
+ viewModel.exchangeGiftListLiveData.value?.let {
+ setupExchangeGiftList(it)
+ }
+ }
+
+ @SuppressLint("SetTextI18n")
+ private fun setupExchangeGiftList(exchangeGiftList: List) {
+ val exchangeGift = exchangeGiftList.firstOrNull { it.level == fairyType } ?: return
+ binding.ivGift.load(exchangeGift.rewardPicUrl)
+ binding.tvGiftName.text = exchangeGift.rewardName
+ binding.tvGiftPrice.text = "${exchangeGift.rewardShowValue}鑽"
+ binding.ivCompound.setOnClickListener {
+ viewModel.exchangeGift(exchangeGift.itemId)
+ }
+ }
+
+ @SuppressLint("SetTextI18n")
+ private fun setupMyFairyInfo(myFairyInfo: MyFairyInfo) {
+ val fairyInfos = when (fairyType) {
+ MyFairyItemView.BASE -> {
+ binding.ivPrevious.isInvisible = true
+ binding.ivTitle.setImageResource(R.drawable.treasure_fairy_ic_exchange_fairy_base)
+ myFairyInfo.lowElves
+ }
+ MyFairyItemView.EPIC -> {
+ binding.ivNext.isInvisible = false
+ binding.ivPrevious.isInvisible = false
+ binding.ivTitle.setImageResource(R.drawable.treasure_fairy_ic_exchange_fairy_epic)
+ myFairyInfo.middleElves
+ }
+ else -> {
+ binding.ivNext.isInvisible = true
+ binding.ivTitle.setImageResource(R.drawable.treasure_fairy_ic_exchange_fairy_legend)
+ myFairyInfo.highElves
+ }
+ }
+
+ var isEnabled = true
+ fairyInfos?.let {
+ fairyItems.forEachIndexed { index, itemView ->
+ itemView.setFairyInfo(it.getOrNull(index))
+ if (it.getOrNull(index)?.elfNum ?: 0 < 1) {
+ isEnabled = false
+ }
+ }
+ }
+ binding.ivCompound.isEnabled = isEnabled
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeFairyRecordFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeFairyRecordFragment.kt
new file mode 100644
index 000000000..34b52a607
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ExchangeFairyRecordFragment.kt
@@ -0,0 +1,58 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyFragmentExchangeRecordFairyBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.ExchangeFairyRecordAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.ExchangeGiftInfo
+
+class ExchangeFairyRecordFragment : BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(): ExchangeFairyRecordFragment {
+ val args = Bundle()
+ val fragment = ExchangeFairyRecordFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private var page = 1
+ private val pageSize = 20
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: ExchangeFairyRecordAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ prizeAdapter = ExchangeFairyRecordAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setPageSize(pageSize)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無數據"))
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(LinearLayoutManager(context))
+ .build()
+
+ viewModel.exchangeFairyRecordLiveData.observe(viewLifecycleOwner) {
+ rvDelegate.loadData(it)
+ }
+
+ prizeAdapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
+
+ loadData(true)
+ }
+
+ private fun loadData(isRefresh: Boolean) {
+ page = if (isRefresh) 1 else (page + 1)
+ viewModel.getExchangeFairyRecord(page, pageSize)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestPrizesChildFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestPrizesChildFragment.kt
new file mode 100644
index 000000000..914864654
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestPrizesChildFragment.kt
@@ -0,0 +1,58 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyFragmentForestPrizesChildBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.ForestPrizesChildAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class ForestPrizesChildFragment :
+ BaseViewBindingFragment() {
+
+ companion object {
+ fun newInstance(type: Int): ForestPrizesChildFragment {
+ val args = Bundle()
+ args.putInt("poolLevel", type)
+ val fragment = ForestPrizesChildFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: ForestPrizesChildAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ prizeAdapter = ForestPrizesChildAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無數據"))
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false))
+ .build()
+
+ val poolLevel = requireArguments().getInt("poolLevel")
+ viewModel.getForestPrizePool(poolLevel)
+
+ viewModel.forestPoolLiveData.observe(viewLifecycleOwner) {
+ it?.let {
+ if (it.first == poolLevel) {
+ rvDelegate.setNewData(it.second)
+ }
+ } ?: run {
+ rvDelegate.setNewData(null)
+ }
+
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestPrizesFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestPrizesFragment.kt
new file mode 100644
index 000000000..ce1d1e3e6
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestPrizesFragment.kt
@@ -0,0 +1,56 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.viewpager.widget.ViewPager
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.databinding.TreasureFairyFragmentForestPrizesBinding
+import com.yizhuan.erban.treasurefairy.adapter.ForestIndicatorAdapter
+import com.yizhuan.erban.ui.user.adapter.UserInfoPagerAdapter
+import com.yizhuan.erban.ui.widget.magicindicator.MagicIndicator
+import com.yizhuan.erban.ui.widget.magicindicator.ViewPagerHelper
+import com.yizhuan.erban.ui.widget.magicindicator.buildins.commonnavigator.CommonNavigator
+
+class ForestPrizesFragment : BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(): ForestPrizesFragment {
+ val args = Bundle()
+ val fragment = ForestPrizesFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ val viewPager: ViewPager = binding.viewPager
+ val magicIndicator: MagicIndicator = binding.magicIndicator
+ val fragmentList: MutableList = ArrayList()
+ fragmentList.add(ForestPrizesChildFragment.newInstance(1))
+ fragmentList.add(ForestPrizesChildFragment.newInstance(2))
+ fragmentList.add(ForestPrizesChildFragment.newInstance(3))
+ val pagerAdapter = UserInfoPagerAdapter(childFragmentManager, fragmentList)
+ val tagList: MutableList = ArrayList()
+ tagList.add("初級森林")
+ tagList.add("史詩森林")
+ tagList.add("傳說森林")
+ val commonNavigator = CommonNavigator(context)
+ commonNavigator.setTitleWrapContent(true)
+ val magicIndicatorAdapter = ForestIndicatorAdapter(context, tagList)
+ magicIndicatorAdapter.setOnItemSelectListener { position: Int, _: TextView ->
+ viewPager.currentItem = position
+ }
+ commonNavigator.adapter = magicIndicatorAdapter
+ magicIndicator.navigator = commonNavigator
+ commonNavigator.titleContainer.showDividers = LinearLayout.SHOW_DIVIDER_MIDDLE
+ viewPager.offscreenPageLimit = 1
+ viewPager.adapter = pagerAdapter
+ ViewPagerHelper.bind(magicIndicator, viewPager)
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestRecordFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestRecordFragment.kt
new file mode 100644
index 000000000..8e7acd6c5
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/ForestRecordFragment.kt
@@ -0,0 +1,58 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyFragmentForestRecordBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.ForestPrizesRecordAdapter
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class ForestRecordFragment : BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(): ForestRecordFragment {
+ val args = Bundle()
+ val fragment = ForestRecordFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private var page = 1
+ private val pageSize = 20
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var prizeAdapter: ForestPrizesRecordAdapter
+ private val viewModel: FairyViewModel by activityViewModels()
+
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ prizeAdapter = ForestPrizesRecordAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(prizeAdapter)
+ .setPageSize(pageSize)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無數據"))
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(LinearLayoutManager(context))
+ .build()
+
+ viewModel.forestRecordLiveData.observe(viewLifecycleOwner) {
+ rvDelegate.loadData(it)
+ }
+
+ prizeAdapter.setOnLoadMoreListener({ loadData(false) }, binding.recyclerView)
+
+ loadData(true)
+ }
+
+ private fun loadData(isRefresh: Boolean) {
+ page = if (isRefresh) 1 else (page + 1)
+ viewModel.getForestRecord(page, pageSize)
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/MyFairyFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/MyFairyFragment.kt
new file mode 100644
index 000000000..d4652cfb4
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/MyFairyFragment.kt
@@ -0,0 +1,75 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.databinding.TreasureFairyFragmentMyFairyBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.dialog.MyFairySearchFriendsDialog
+import com.yizhuan.erban.treasurefairy.view.MyFairyItemView
+
+class MyFairyFragment : BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(fairyType: Int): MyFairyFragment {
+ val args = Bundle()
+ args.putInt("fairyType", fairyType)
+ val fragment = MyFairyFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val fairyType by lazy { requireArguments().getInt("fairyType", MyFairyItemView.BASE) }
+ private val viewModel: FairyViewModel by activityViewModels()
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ val fairyItems = arrayListOf(
+ binding.fairyItem0,
+ binding.fairyItem1,
+ binding.fairyItem2,
+ binding.fairyItem3,
+ binding.fairyItem4
+ )
+ fairyItems.forEach {
+ it.setFairyType(fairyType)
+ it.setOnItemClickListener { view, fairyInfo ->
+ if (fairyInfo == null) return@setOnItemClickListener
+ when (view.id) {
+ R.id.iv_fairy_send -> {
+ MyFairySearchFriendsDialog.newInstance(fairyInfo, true).show(context)
+ }
+ R.id.iv_fairy_get -> {
+ MyFairySearchFriendsDialog.newInstance(fairyInfo, false).show(context)
+ }
+ }
+ }
+ }
+ viewModel.myFairyInfoLiveData.observe(viewLifecycleOwner) {
+ it?.let {
+ val fairyInfos = when (fairyType) {
+ MyFairyItemView.BASE -> {
+ it.lowElves
+ }
+ MyFairyItemView.EPIC -> {
+ it.middleElves
+ }
+ else -> {
+ it.highElves
+ }
+ }
+ fairyInfos?.let {
+ fairyItems.forEachIndexed { index, itemView ->
+ itemView.setFairyInfo(it.getOrNull(index))
+ }
+ }
+ }
+ }
+
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/TestFairyFragment.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/TestFairyFragment.kt
new file mode 100644
index 000000000..6652d8b76
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/fragment/TestFairyFragment.kt
@@ -0,0 +1,158 @@
+package com.yizhuan.erban.treasurefairy.fragment
+
+import android.annotation.SuppressLint
+import android.os.Bundle
+import androidx.fragment.app.activityViewModels
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.yizhuan.erban.R
+import com.yizhuan.erban.base.BaseViewBindingFragment
+import com.yizhuan.erban.common.EmptyViewHelper
+import com.yizhuan.erban.databinding.TreasureFairyFragmentTestFairyBinding
+import com.yizhuan.erban.treasurefairy.FairyViewModel
+import com.yizhuan.erban.treasurefairy.adapter.TestFairyAdapter
+import com.yizhuan.erban.treasurefairy.dialog.TestFairyResultDialog
+import com.yizhuan.erban.treasurefairy.view.MyFairyItemView
+import com.yizhuan.erban.ui.utils.RVDelegate
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+
+class TestFairyFragment : BaseViewBindingFragment() {
+
+
+ companion object {
+ fun newInstance(fairyType: Int): TestFairyFragment {
+ val args = Bundle()
+ args.putInt("fairyType", fairyType)
+ val fragment = TestFairyFragment()
+ fragment.arguments = args
+ return fragment
+ }
+ }
+
+ private val fairyType by lazy { requireArguments().getInt("fairyType", MyFairyItemView.BASE) }
+ private val viewModel: FairyViewModel by activityViewModels()
+ private lateinit var rvDelegate: RVDelegate
+ private lateinit var testFairyAdapter: TestFairyAdapter
+
+ private val showResultRunnable = Runnable {
+ if (canShowResult) {
+ canShowResult = false
+ binding.ivBegin.isEnabled = true
+ if (fairyType == MyFairyItemView.BASE) {
+ viewModel.testResultLiveData
+ } else {
+ viewModel.testLegendResultLiveData
+ }.value?.peekContent()?.let {
+ TestFairyResultDialog.newInstance(it).show(context)
+ }
+
+ } else {
+ resultNotShowed = true
+ }
+ }
+ private var canShowResult = false
+ private var resultNotShowed = false
+
+ @SuppressLint("CheckResult")
+ override fun init() {
+ val fairyViews = listOf(binding.ivFairy0, binding.ivFairy1, binding.ivFairy2)
+ testFairyAdapter = TestFairyAdapter()
+ rvDelegate = RVDelegate.Builder()
+ .setAdapter(testFairyAdapter)
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context,"暫無數據"))
+ .setRecyclerView(binding.recyclerView)
+ .setLayoutManager(GridLayoutManager(context, 5, LinearLayoutManager.VERTICAL, false))
+ .build()
+
+ viewModel.myFairyInfoLiveData.observe(viewLifecycleOwner) {
+ val fairyInfos = it?.let {
+ when (fairyType) {
+ MyFairyItemView.EPIC -> {
+ it.middleElves
+ }
+ else -> {
+ it.lowElves
+ }
+ }
+ }
+ rvDelegate.setNewData(fairyInfos)
+ }
+
+ if (fairyType == MyFairyItemView.EPIC) {
+ binding.tvTips.text = "點擊投入試煉傳說精靈"
+ }
+
+ testFairyAdapter.setOnItemClickListener { _, _, position ->
+ testFairyAdapter.getItem(position)?.let {
+ viewModel.addTestFairy(it)
+ }
+ }
+
+ fairyViews.forEachIndexed { index, imageView ->
+ imageView.setOnClickListener {
+ viewModel.minusTestFairy(index)
+ }
+ }
+ binding.tvReset.setOnClickListener {
+ viewModel.cleanTestParam()
+ }
+ binding.tvOneKeyAdd.setOnClickListener {
+ viewModel.oneKeyAdd(testFairyAdapter.data)
+ }
+
+ if (fairyType == MyFairyItemView.EPIC) {
+ binding.viewBgAnim.setBackgroundResource(R.drawable.treasure_fairy_bg_test_fairy_anim_legend)
+ binding.viewBgTop.setBackgroundResource(R.drawable.treasure_fairy_bg_test_fairy_legend)
+ }
+
+ binding.ivBegin.setOnClickListener {
+ if (viewModel.testFairy(fairyType)) {
+ binding.animView.startPlay(
+ requireContext().assets,
+ if (fairyType == MyFairyItemView.BASE) {
+ "vap/test_fairy_anim_epic.mp4"
+ } else {
+ "vap/test_fairy_anim_legend.mp4"
+ }
+ )
+ binding.ivBegin.isEnabled = false
+ canShowResult = false
+ binding.ivBegin.postDelayed(showResultRunnable, 1800)
+ }
+ }
+ binding.animView.setOnClickListener {
+ if (canShowResult) {
+ binding.ivBegin.removeCallbacks(showResultRunnable)
+ showResultRunnable.run()
+ }
+ }
+ (if (fairyType == MyFairyItemView.BASE) {
+ viewModel.testResultLiveData
+ } else {
+ viewModel.testLegendResultLiveData
+ }).observe(
+ viewLifecycleOwner
+ ) {
+ it?.getContentIfNotHandled()?.let {
+ canShowResult = true
+ if (resultNotShowed) {
+ showResultRunnable.run()
+ }
+ } ?: run {
+ binding.ivBegin.isEnabled = true
+ }
+ }
+ viewModel.compoundFairyInfosLiveData.observe(viewLifecycleOwner) {
+ fairyViews.forEachIndexed { index, imageView ->
+ it?.get(index)?.elfPicUrl?.let { elfPicUrl ->
+ imageView.load(elfPicUrl)
+ } ?: run {
+ imageView.setImageDrawable(null)
+ }
+ }
+ testFairyAdapter.notifyDataSetChanged()
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/view/CustomDrawable.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/CustomDrawable.kt
new file mode 100644
index 000000000..db1ee9dcb
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/CustomDrawable.kt
@@ -0,0 +1,63 @@
+package com.yizhuan.erban.treasurefairy.view
+
+import android.graphics.*
+import android.graphics.drawable.Drawable
+
+class CustomDrawable(private val innerDrawable: Drawable) : Drawable() {
+ private val srcPaint: Paint
+
+ /**
+ * 使用时需要自定义path
+ */
+ private var srcPath: Path = Path()
+ private val xFermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
+
+ /**
+ * 设置内部透明的部分
+ */
+ fun setSrcPath(srcPath: Path) {
+ this.srcPath = srcPath
+ }
+
+ override fun draw(canvas: Canvas) {
+ innerDrawable.bounds = bounds
+ if (srcPath.isEmpty) {
+ innerDrawable.draw(canvas)
+ } else {
+ // 将绘制操作保存到新的图层
+ val saveCount = canvas.saveLayer(
+ 0f, 0f, bounds.width().toFloat(), bounds.height().toFloat(), srcPaint,
+ Canvas.ALL_SAVE_FLAG
+ )
+ // 绘制目标图
+ innerDrawable.draw(canvas)
+ // 设置混合模式
+ srcPaint.xfermode = xFermode
+ // src 绘制源图
+ canvas.drawPath(srcPath, srcPaint)
+ // 清除混合模式
+ srcPaint.xfermode = null
+ // 还原画布
+ canvas.restoreToCount(saveCount)
+ }
+ }
+
+ override fun setAlpha(alpha: Int) {
+ innerDrawable.alpha = alpha
+ }
+
+ override fun setColorFilter(colorFilter: ColorFilter?) {
+ innerDrawable.colorFilter = colorFilter
+ }
+
+ override fun getOpacity(): Int {
+ return innerDrawable.opacity
+ }
+
+ init {
+ // path默认实现
+ srcPath.addRect(100f, 100f, 200f, 200f, Path.Direction.CW)
+ srcPaint = Paint(Paint.ANTI_ALIAS_FLAG)
+ srcPaint.color = -0x1
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/view/ExchangeItemView.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/ExchangeItemView.kt
new file mode 100644
index 000000000..d1512f1b1
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/ExchangeItemView.kt
@@ -0,0 +1,35 @@
+package com.yizhuan.erban.treasurefairy.view
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.util.AttributeSet
+import androidx.annotation.Nullable
+import androidx.constraintlayout.widget.ConstraintLayout
+import com.yizhuan.erban.R
+import com.yizhuan.erban.databinding.TreasureFairyItemExchangeBinding
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+
+class ExchangeItemView @JvmOverloads constructor(
+ context: Context,
+ @Nullable attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : ConstraintLayout(context, attrs, defStyleAttr) {
+
+ private val binding: TreasureFairyItemExchangeBinding
+
+ init {
+ inflate(context, R.layout.treasure_fairy_item_exchange, this)
+ binding = TreasureFairyItemExchangeBinding.bind(this)
+ }
+
+ @SuppressLint("SetTextI18n")
+ fun setFairyInfo(fairyInfo: FairyInfo?) {
+ fairyInfo?.let {
+ binding.ivFairyIcon.load(it.elfPicUrl)
+ binding.tvFairyName.text = it.elfName
+ binding.tvFairyNum.text = "${it.elfNum}"
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/view/HomeItemView.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/HomeItemView.kt
new file mode 100644
index 000000000..854fa5c87
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/HomeItemView.kt
@@ -0,0 +1,30 @@
+package com.yizhuan.erban.treasurefairy.view
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.FrameLayout
+import androidx.annotation.Nullable
+import com.yizhuan.erban.R
+import com.yizhuan.erban.databinding.TreasureFairyItemHomeBinding
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.PrizeInfo
+
+class HomeItemView @JvmOverloads constructor(
+ context: Context,
+ @Nullable attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr) {
+
+ private val binding: TreasureFairyItemHomeBinding
+
+ init {
+ inflate(context, R.layout.treasure_fairy_item_home, this)
+ binding = TreasureFairyItemHomeBinding.bind(this)
+ }
+
+ fun setPrizeInfo(prizeInfo: PrizeInfo) {
+ binding.ivPrizeIcon.load(prizeInfo.rewardPicUrl)
+ binding.tvPrizeName.text = prizeInfo.rewardName
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/treasurefairy/view/MyFairyItemView.kt b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/MyFairyItemView.kt
new file mode 100644
index 000000000..aff38c6d3
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/treasurefairy/view/MyFairyItemView.kt
@@ -0,0 +1,118 @@
+package com.yizhuan.erban.treasurefairy.view
+
+import android.annotation.SuppressLint
+import android.content.Context
+import android.graphics.Color
+import android.util.AttributeSet
+import android.view.View
+import android.widget.FrameLayout
+import androidx.annotation.Nullable
+import androidx.core.graphics.toColorInt
+import androidx.core.view.isVisible
+import com.yizhuan.erban.R
+import com.yizhuan.erban.databinding.TreasureFairyItemMyFairyBaseBinding
+import com.yizhuan.erban.ui.utils.load
+import com.yizhuan.xchat_android_core.treasurefairy.FairyInfo
+
+class MyFairyItemView @JvmOverloads constructor(
+ context: Context,
+ @Nullable attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0
+) : FrameLayout(context, attrs, defStyleAttr) {
+
+ companion object {
+ const val BASE = 1
+ const val EPIC = 2
+ const val LEGEND = 3
+ }
+
+ private val binding: TreasureFairyItemMyFairyBaseBinding
+ private var fairyInfo: FairyInfo? = null
+
+ init {
+ inflate(context, R.layout.treasure_fairy_item_my_fairy_base, this)
+ binding = TreasureFairyItemMyFairyBaseBinding.bind(this)
+ binding.clSurface.setOnClickListener {
+ binding.root.animate()
+ .rotationY(180f)
+ .setDuration(500)
+ .start()
+ binding.root.postDelayed({
+ binding.clSurface.isVisible = false
+ binding.clBack.isVisible = true
+ }, 250)
+ }
+ binding.clBack.setOnClickListener {
+ binding.root.animate()
+ .rotationY(0f)
+ .setDuration(500)
+ .start()
+ binding.root.postDelayed({
+ binding.clSurface.isVisible = true
+ binding.clBack.isVisible = false
+ }, 250)
+ }
+
+ binding.ivFairySend.setOnClickListener {
+
+ }
+ }
+
+ @SuppressLint("SetTextI18n")
+ fun setFairyInfo(fairyInfo: FairyInfo?) {
+ this.fairyInfo = fairyInfo
+ fairyInfo?.let {
+ binding.tvFairyName.text = it.elfName
+ binding.tvFairyNameBack.text = it.elfName
+ binding.tvFairyNum.text = "x${it.elfNum}"
+ binding.tvFairyNumBack.text = "x${it.elfNum}"
+ binding.ivFairyIcon.load(it.elfPicUrl)
+ binding.ivFairyIconBack.load(it.elfPicUrl)
+ binding.ivFairyEmpty.isVisible = it.elfNum == 0
+ binding.ivFairySend.isVisible = it.elfNum > 0
+ binding.viewCover.isVisible = it.elfNum == 0
+ }
+ }
+
+ fun setOnItemClickListener(onItemClickListener: (view: View, fairyInfo: FairyInfo?) -> Unit) {
+ binding.ivFairyGet.setOnClickListener {
+ onItemClickListener(it, fairyInfo)
+ }
+ binding.ivFairySend.setOnClickListener {
+ onItemClickListener(it, fairyInfo)
+ }
+ }
+
+ fun setFairyType(fairyType: Int) {
+ when (fairyType) {
+ BASE -> {
+ binding.viewBg.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_base)
+ binding.viewBgBack.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_base)
+ binding.viewCover.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_base_cover)
+ binding.tvFairyName.setTextColor("#A4FFFC".toColorInt())
+ binding.tvFairyNameBack.setTextColor("#A4FFFC".toColorInt())
+ binding.tvFairyNum.setTextColor("#FFE8AA".toColorInt())
+ binding.tvFairyNumBack.setTextColor("#FFE8AA".toColorInt())
+ }
+ EPIC -> {
+ binding.viewBg.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_epic)
+ binding.viewBgBack.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_epic)
+ binding.viewCover.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_epic_cover)
+ binding.tvFairyName.setTextColor("#FFFED6".toColorInt())
+ binding.tvFairyNameBack.setTextColor("#FFFED6".toColorInt())
+ binding.tvFairyNum.setTextColor("#59FDFF".toColorInt())
+ binding.tvFairyNumBack.setTextColor("#59FDFF".toColorInt())
+ }
+ LEGEND -> {
+ binding.viewBg.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_legend)
+ binding.viewBgBack.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_legend)
+ binding.viewCover.setBackgroundResource(R.drawable.treasure_fairy_bg_my_fairy_item_legend_cover)
+ binding.tvFairyName.setTextColor(Color.WHITE)
+ binding.tvFairyNameBack.setTextColor(Color.WHITE)
+ binding.tvFairyNum.setTextColor("#FFE8AA".toColorInt())
+ binding.tvFairyNumBack.setTextColor("#FFE8AA".toColorInt())
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/GrantedPermissionsActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/setting/GrantedPermissionsActivity.kt
index c25a6f227..9568a7601 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/setting/GrantedPermissionsActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/ui/setting/GrantedPermissionsActivity.kt
@@ -45,7 +45,7 @@ class GrantedPermissionsActivity : BaseActivity() {
rvDelegate = RVDelegate.Builder()
.setLayoutManager(LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false))
.setRecyclerView(recyclerView)
- .setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.ui_setting_grantedpermissionsactivity_02)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.ui_setting_grantedpermissionsactivity_02)))
.setAdapter(PermissionAdapter())
.build()
}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/setting/ShieldManageActivity.kt b/app/src/main/java/com/yizhuan/erban/ui/setting/ShieldManageActivity.kt
index 7c8869dbe..b89445793 100644
--- a/app/src/main/java/com/yizhuan/erban/ui/setting/ShieldManageActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/ui/setting/ShieldManageActivity.kt
@@ -46,7 +46,7 @@ class ShieldManageActivity : BaseViewBindingActivity {
public void loadErr(boolean isRefresh) {
if (isRefresh) {
if (!NetworkUtil.isNetAvailable(recyclerView.getContext())) {
- adapter.setEmptyView(EmptyViewHelper.createEmptyView(recyclerView.getContext(), ResUtil.getString(R.string.ui_utils_rvdelegate_01)));
+ adapter.setEmptyView(EmptyViewHelper.createEmptyTextView(recyclerView.getContext(), ResUtil.getString(R.string.ui_utils_rvdelegate_01)));
} else if (emptyView != null) {
adapter.setEmptyView(emptyView);
}
diff --git a/app/src/main/java/com/yizhuan/erban/ui/webview/FairyDialogWebViewActivity.java b/app/src/main/java/com/yizhuan/erban/ui/webview/FairyDialogWebViewActivity.java
new file mode 100644
index 000000000..20b7c7651
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/ui/webview/FairyDialogWebViewActivity.java
@@ -0,0 +1,42 @@
+package com.yizhuan.erban.ui.webview;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.view.Gravity;
+import android.view.View;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+import com.netease.nim.uikit.common.util.sys.ScreenUtil;
+import com.yizhuan.erban.R;
+
+public class FairyDialogWebViewActivity extends CommonWebViewActivity {
+
+
+ public static void start(Context context, String url) {
+ Intent intent = new Intent(context, FairyDialogWebViewActivity.class);
+ intent.putExtra("url", url);
+ context.startActivity(intent);
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ getWindow().setLayout(WindowManager.LayoutParams.MATCH_PARENT, ScreenUtil.screenHeight - ScreenUtil.getStatusBarHeight(this));
+ getWindow().setGravity(Gravity.BOTTOM);
+ View layoutRoot = findViewById(R.id.ll_root);
+ FrameLayout.LayoutParams layoutParams = (FrameLayout.LayoutParams) layoutRoot.getLayoutParams();
+ layoutParams.height = ScreenUtil.screenWidth * 1100 / 750;
+ layoutParams.width = FrameLayout.LayoutParams.MATCH_PARENT;
+ layoutRoot.setLayoutParams(layoutParams);
+ layoutTitleBar.setVisibility(View.GONE);
+ webView.setBackgroundColor(0);
+ webView.getBackground().setAlpha(0);
+ }
+
+ @Override
+ protected int getLayoutId() {
+ return R.layout.activity_elf_dialog_web_view;
+ }
+}
diff --git a/app/src/main/java/com/yizhuan/erban/utils/MsgBuilder.kt b/app/src/main/java/com/yizhuan/erban/utils/MsgBuilder.kt
new file mode 100644
index 000000000..6591f219e
--- /dev/null
+++ b/app/src/main/java/com/yizhuan/erban/utils/MsgBuilder.kt
@@ -0,0 +1,95 @@
+package com.yizhuan.erban.utils
+
+import android.text.style.ForegroundColorSpan
+import android.view.View
+import androidx.core.graphics.toColorInt
+import com.yizhuan.erban.ui.webview.CommonWebViewActivity
+import com.yizhuan.xchat_android_core.im.custom.bean.FairyMsgAttachment
+import com.yizhuan.xchat_android_core.manager.RoomEvent
+import com.yizhuan.xchat_android_core.utils.sub
+
+class MsgBuilder {
+
+ companion object {
+
+ @JvmStatic
+ fun setUpKitchenClick(view: View, skipUrl: String, needLevel: Int): Boolean {
+ val expLevel = UserUtils.getExpLevel()
+ if (expLevel != 0 && needLevel != 0 && expLevel >= needLevel) {
+ view.setOnClickListener {
+ CommonWebViewActivity.start(
+ view.context,
+ skipUrl
+ )
+ }
+ return true
+ }
+ return false
+ }
+
+ @JvmStatic
+ fun buildFairyMsg(
+ roomEvent: Int,
+ attachment: FairyMsgAttachment
+ ): SpannableBuilder {
+ val builder = SpannableBuilder()
+ val fairyMsgInfo = attachment.fairyMsgInfo
+ when (roomEvent) {
+ RoomEvent.FAIRY_DRAW_GIFT_L4,
+ RoomEvent.FAIRY_DRAW_GIFT_L5 -> {
+ builder.append("好运爆棚!", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ fairyMsgInfo.nick.sub(6),
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ .append(" 在夺宝精灵中获得 ", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ fairyMsgInfo.rewardName,
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ }
+
+ RoomEvent.FAIRY_CONVERT_L1 -> {
+ builder.append("厉害了!", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ fairyMsgInfo.nick.sub(6),
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ .append(" 在夺宝精灵中初级召唤 ", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ "${fairyMsgInfo.rewardShowValue}钻${fairyMsgInfo.rewardName}",
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ }
+ RoomEvent.FAIRY_CONVERT_L2 -> {
+ builder.append("厉害了!", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ fairyMsgInfo.nick.sub(6),
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ .append(" 在夺宝精灵中史诗召唤 ", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ "${fairyMsgInfo.rewardShowValue}钻${fairyMsgInfo.rewardName}",
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ }
+
+ RoomEvent.FAIRY_CONVERT_L3 -> {
+ builder.append("厉害了!", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ fairyMsgInfo.nick.sub(6),
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ .append(" 在夺宝精灵中传说召唤 ", ForegroundColorSpan("#8C4700".toColorInt()))
+ .append(
+ "${fairyMsgInfo.rewardShowValue}钻${fairyMsgInfo.rewardName}",
+ ForegroundColorSpan("#EC4613".toColorInt())
+ )
+ }
+ }
+ return builder
+
+ }
+
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt b/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt
index b76e0b936..ecfa4a8a6 100644
--- a/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt
+++ b/app/src/main/java/com/yizhuan/erban/vip/VipMainActivity.kt
@@ -98,7 +98,7 @@ class VipMainActivity : BaseViewBindingActivity(),
.setLayoutManager(GridLayoutManager(this, 3))
.setRecyclerView(binding.recyclerView)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
context,
getString(R.string.me_no_search_results)
)
diff --git a/app/src/main/res/drawable-xhdpi/ic_fairy_entrance.png b/app/src/main/res/drawable-xhdpi/ic_fairy_entrance.png
new file mode 100644
index 000000000..244287a57
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_fairy_entrance.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_big_prize.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_big_prize.webp
new file mode 100644
index 000000000..a8fa52385
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_big_prize.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_elf.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_elf.webp
new file mode 100644
index 000000000..ed6452d04
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_elf.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_compound.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_compound.webp
new file mode 100644
index 000000000..65e715fc0
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_compound.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_debris_item.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_debris_item.webp
new file mode 100644
index 000000000..ce2d97a80
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_debris_item.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_fairy_gift.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_fairy_gift.webp
new file mode 100644
index 000000000..8e678e754
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_fairy_gift.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_gift_space.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_gift_space.png
new file mode 100644
index 000000000..ac410a684
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_gift_space.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_item.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_item.webp
new file mode 100644
index 000000000..307cfc178
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_item.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title.webp
new file mode 100644
index 000000000..8c6d644fa
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_debris_checked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_debris_checked.webp
new file mode 100644
index 000000000..e8106efdd
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_debris_checked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_debris_unchecked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_debris_unchecked.webp
new file mode 100644
index 000000000..d36344846
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_debris_unchecked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_fairy_checked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_fairy_checked.webp
new file mode 100644
index 000000000..d18db2afa
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_fairy_checked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_fairy_unchecked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_fairy_unchecked.webp
new file mode 100644
index 000000000..e370bf438
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_exchange_title_fairy_unchecked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest.webp
new file mode 100644
index 000000000..6df5d5934
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_base.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_base.webp
new file mode 100644
index 000000000..b33fa990a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_base.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_bottom.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_bottom.webp
new file mode 100644
index 000000000..9fc9bcd06
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_bottom.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_epic.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_epic.webp
new file mode 100644
index 000000000..e2b88f1d7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_epic.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_grab_1.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_grab_1.webp
new file mode 100644
index 000000000..d94957a03
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_grab_1.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_grab_10.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_grab_10.webp
new file mode 100644
index 000000000..455b5dd6c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_grab_10.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_legend.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_legend.webp
new file mode 100644
index 000000000..37c460ff5
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_legend.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_pool.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_pool.webp
new file mode 100644
index 000000000..8804b4bd4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_pool.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize.webp
new file mode 100644
index 000000000..26a31bbd4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize_close.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize_close.webp
new file mode 100644
index 000000000..3ac8190f5
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize_close.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize_single.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize_single.webp
new file mode 100644
index 000000000..6438b584a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_prize_single.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_record.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_record.webp
new file mode 100644
index 000000000..f83d39db6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_record.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_test.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_test.webp
new file mode 100644
index 000000000..d1d7404ce
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_test.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_prize_checked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_prize_checked.webp
new file mode 100644
index 000000000..a18a1dc71
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_prize_checked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_prize_unchecked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_prize_unchecked.webp
new file mode 100644
index 000000000..08531c440
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_prize_unchecked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_record_checked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_record_checked.webp
new file mode 100644
index 000000000..f49fd021a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_record_checked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_record_unchecked.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_record_unchecked.webp
new file mode 100644
index 000000000..cee49dc8b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_forest_title_record_unchecked.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home.webp
new file mode 100644
index 000000000..c2ae0274f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_popup_window.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_popup_window.webp
new file mode 100644
index 000000000..af7a7b897
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_popup_window.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_prize.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_prize.webp
new file mode 100644
index 000000000..dc7c3e33d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_prize.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_prize_number.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_prize_number.png
new file mode 100644
index 000000000..0c0d9a2e3
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_home_prize_number.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_home_prize.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_home_prize.webp
new file mode 100644
index 000000000..2b72c1571
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_home_prize.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_select.webp
new file mode 100644
index 000000000..f77e305df
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_unselect.webp
new file mode 100644
index 000000000..e32b382dd
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_item_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_key_number.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_key_number.webp
new file mode 100644
index 000000000..abf294862
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_key_number.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_lucky_value.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_lucky_value.webp
new file mode 100644
index 000000000..8ecc68d95
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_lucky_value.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_friend_title.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_friend_title.webp
new file mode 100644
index 000000000..17004795e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_friend_title.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_base.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_base.webp
new file mode 100644
index 000000000..23f9d39ec
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_base.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_base_cover.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_base_cover.webp
new file mode 100644
index 000000000..7481a94d7
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_base_cover.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_epic.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_epic.webp
new file mode 100644
index 000000000..32de5e43b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_epic.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_epic_cover.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_epic_cover.webp
new file mode 100644
index 000000000..38b4b40d4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_epic_cover.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_legend.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_legend.webp
new file mode 100644
index 000000000..d9d28bfe9
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_legend.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_legend_cover.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_legend_cover.webp
new file mode 100644
index 000000000..5c09be035
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_item_legend_cover.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_record.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_record.webp
new file mode 100644
index 000000000..04708ffef
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_record.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_rg.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_rg.webp
new file mode 100644
index 000000000..78aa3fa9e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_rg.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send.webp
new file mode 100644
index 000000000..36da898e8
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send_buy.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send_buy.webp
new file mode 100644
index 000000000..3709bbf19
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send_buy.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send_cancel.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send_cancel.webp
new file mode 100644
index 000000000..2bab8be74
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_send_cancel.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_tip_text.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_tip_text.webp
new file mode 100644
index 000000000..895c1dd1a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_my_fairy_tip_text.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_notify.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_notify.webp
new file mode 100644
index 000000000..16900a341
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_notify.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_1.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_1.webp
new file mode 100644
index 000000000..92b4f27ca
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_1.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_10.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_10.webp
new file mode 100644
index 000000000..35f0a4ccc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_10.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_100.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_100.webp
new file mode 100644
index 000000000..66f2e9fed
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_open_100.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy.webp
new file mode 100644
index 000000000..0a767113b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim.webp
new file mode 100644
index 000000000..464f0f847
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim_epic.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim_epic.png
new file mode 100644
index 000000000..8ac6d86fc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim_epic.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim_legend.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim_legend.png
new file mode 100644
index 000000000..562230b26
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_anim_legend.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_begin.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_begin.webp
new file mode 100644
index 000000000..7cdff9f22
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_begin.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_bottom.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_bottom.webp
new file mode 100644
index 000000000..d84249adc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_bottom.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_item_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_item_select.webp
new file mode 100644
index 000000000..ddd131c22
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_item_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_item_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_item_unselect.webp
new file mode 100644
index 000000000..445d3d834
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_item_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_legend.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_legend.webp
new file mode 100644
index 000000000..da6799176
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_legend.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_record.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_record.webp
new file mode 100644
index 000000000..d2e5b08a1
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_bg_test_fairy_record.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_back.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_back.webp
new file mode 100644
index 000000000..d1296aefc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_back.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_compound.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_compound.webp
new file mode 100644
index 000000000..66327cbbc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_compound.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_compound_disable.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_compound_disable.webp
new file mode 100644
index 000000000..536dbc851
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_compound_disable.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris.webp
new file mode 100644
index 000000000..d00c09332
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris_select.webp
new file mode 100644
index 000000000..9dece356d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris_unselect.webp
new file mode 100644
index 000000000..331ee3d93
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_debris_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_base.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_base.png
new file mode 100644
index 000000000..1a367420d
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_base.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_epic.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_epic.png
new file mode 100644
index 000000000..d6b58bccc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_epic.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_legend.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_legend.png
new file mode 100644
index 000000000..1bacf1f10
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_legend.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_select.webp
new file mode 100644
index 000000000..7cec9e95c
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_unselect.webp
new file mode 100644
index 000000000..2f6c02a68
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_fairy_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_next.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_next.webp
new file mode 100644
index 000000000..f9d77390e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_exchange_next.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_fairy_treasure.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_fairy_treasure.webp
new file mode 100644
index 000000000..81ce04a11
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_fairy_treasure.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_base.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_base.webp
new file mode 100644
index 000000000..57ea83df5
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_base.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_epic.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_epic.webp
new file mode 100644
index 000000000..01e2021d9
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_epic.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_legend.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_legend.webp
new file mode 100644
index 000000000..4f7a43535
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_legend.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_next.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_next.webp
new file mode 100644
index 000000000..d226a9833
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_next.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_record.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_record.webp
new file mode 100644
index 000000000..b62ce94b4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_record.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_store.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_store.webp
new file mode 100644
index 000000000..9673e462b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_store.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_title.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_title.webp
new file mode 100644
index 000000000..368277ea4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_forest_title.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_home_title.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_home_title.webp
new file mode 100644
index 000000000..916bb53bc
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_home_title.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone.webp
new file mode 100644
index 000000000..b7e931b5e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone_default.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone_default.webp
new file mode 100644
index 000000000..72a12a08b
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone_default.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone_empty.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone_empty.webp
new file mode 100644
index 000000000..fb2bcb159
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_lucky_stone_empty.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_more.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_more.webp
new file mode 100644
index 000000000..4d042567e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_more.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy.webp
new file mode 100644
index 000000000..74b587fb9
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_base_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_base_select.webp
new file mode 100644
index 000000000..c206196ad
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_base_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_base_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_base_unselect.webp
new file mode 100644
index 000000000..672ee9d30
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_base_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_empty.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_empty.webp
new file mode 100644
index 000000000..84ebbe3fb
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_empty.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_epic_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_epic_select.webp
new file mode 100644
index 000000000..1e3a6fc58
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_epic_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_epic_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_epic_unselect.webp
new file mode 100644
index 000000000..3ae6bcee2
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_epic_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_get.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_get.webp
new file mode 100644
index 000000000..7b69feafa
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_get.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_legend_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_legend_select.webp
new file mode 100644
index 000000000..17f73f3a4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_legend_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_legend_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_legend_unselect.webp
new file mode 100644
index 000000000..36e5a0869
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_legend_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_record.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_record.webp
new file mode 100644
index 000000000..15c766434
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_record.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_send.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_send.webp
new file mode 100644
index 000000000..9e56b9bde
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_send.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_title.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_title.webp
new file mode 100644
index 000000000..5f7dc948a
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_my_fairy_title.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_epic_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_epic_select.webp
new file mode 100644
index 000000000..1a0486356
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_epic_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_epic_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_epic_unselect.webp
new file mode 100644
index 000000000..637ad881f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_epic_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_legend_select.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_legend_select.webp
new file mode 100644
index 000000000..83795f893
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_legend_select.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_legend_unselect.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_legend_unselect.webp
new file mode 100644
index 000000000..0dc1e7187
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_legend_unselect.webp differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_refresh.png b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_refresh.png
new file mode 100644
index 000000000..ddd1096ca
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_refresh.png differ
diff --git a/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_title.webp b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_title.webp
new file mode 100644
index 000000000..a79eebf6e
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/treasure_fairy_ic_test_fairy_title.webp differ
diff --git a/app/src/main/res/drawable/selector_bg_fairy_exchange_compound.xml b/app/src/main/res/drawable/selector_bg_fairy_exchange_compound.xml
new file mode 100644
index 000000000..39c521b51
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_exchange_compound.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_exchange_debris.xml b/app/src/main/res/drawable/selector_bg_fairy_exchange_debris.xml
new file mode 100644
index 000000000..fa063b82e
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_exchange_debris.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_exchange_fairy.xml b/app/src/main/res/drawable/selector_bg_fairy_exchange_fairy.xml
new file mode 100644
index 000000000..999c03c5b
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_exchange_fairy.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_exchange_record_debris.xml b/app/src/main/res/drawable/selector_bg_fairy_exchange_record_debris.xml
new file mode 100644
index 000000000..e61141072
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_exchange_record_debris.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_exchange_record_fairy.xml b/app/src/main/res/drawable/selector_bg_fairy_exchange_record_fairy.xml
new file mode 100644
index 000000000..38e2fafd2
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_exchange_record_fairy.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_forest_prize.xml b/app/src/main/res/drawable/selector_bg_fairy_forest_prize.xml
new file mode 100644
index 000000000..a7bf64a32
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_forest_prize.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_forest_record.xml b/app/src/main/res/drawable/selector_bg_fairy_forest_record.xml
new file mode 100644
index 000000000..a5c89e2fb
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_forest_record.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_home_item.xml b/app/src/main/res/drawable/selector_bg_fairy_home_item.xml
new file mode 100644
index 000000000..628760836
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_home_item.xml
@@ -0,0 +1,10 @@
+
+
+
+
+ -
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_my_base.xml b/app/src/main/res/drawable/selector_bg_fairy_my_base.xml
new file mode 100644
index 000000000..ded6c58c3
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_my_base.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_my_epic.xml b/app/src/main/res/drawable/selector_bg_fairy_my_epic.xml
new file mode 100644
index 000000000..25560f52c
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_my_epic.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_my_legend.xml b/app/src/main/res/drawable/selector_bg_fairy_my_legend.xml
new file mode 100644
index 000000000..677ac11bb
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_my_legend.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_test_epic.xml b/app/src/main/res/drawable/selector_bg_fairy_test_epic.xml
new file mode 100644
index 000000000..640031cb4
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_test_epic.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/selector_bg_fairy_test_legend.xml b/app/src/main/res/drawable/selector_bg_fairy_test_legend.xml
new file mode 100644
index 000000000..fd0fa738e
--- /dev/null
+++ b/app/src/main/res/drawable/selector_bg_fairy_test_legend.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/app/src/main/res/drawable/shape_006e7c_to_00b9af.xml b/app/src/main/res/drawable/shape_006e7c_to_00b9af.xml
new file mode 100644
index 000000000..3fe25b59c
--- /dev/null
+++ b/app/src/main/res/drawable/shape_006e7c_to_00b9af.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_00a69d_4dp_round.xml b/app/src/main/res/drawable/shape_00a69d_4dp_round.xml
new file mode 100644
index 000000000..59df64048
--- /dev/null
+++ b/app/src/main/res/drawable/shape_00a69d_4dp_round.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_00a69d_8dp_round.xml b/app/src/main/res/drawable/shape_00a69d_8dp_round.xml
new file mode 100644
index 000000000..1c11eebc6
--- /dev/null
+++ b/app/src/main/res/drawable/shape_00a69d_8dp_round.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_066a6e_20dp_round.xml b/app/src/main/res/drawable/shape_066a6e_20dp_round.xml
new file mode 100644
index 000000000..810388255
--- /dev/null
+++ b/app/src/main/res/drawable/shape_066a6e_20dp_round.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_3aeac7_to_fffebb.xml b/app/src/main/res/drawable/shape_3aeac7_to_fffebb.xml
new file mode 100644
index 000000000..375f34ec4
--- /dev/null
+++ b/app/src/main/res/drawable/shape_3aeac7_to_fffebb.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/drawable/shape_3aeac7_to_fffebb_4dp.xml b/app/src/main/res/drawable/shape_3aeac7_to_fffebb_4dp.xml
new file mode 100644
index 000000000..4f90f0c00
--- /dev/null
+++ b/app/src/main/res/drawable/shape_3aeac7_to_fffebb_4dp.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_elf_dialog_web_view.xml b/app/src/main/res/layout/activity_elf_dialog_web_view.xml
new file mode 100644
index 000000000..9960cbfe7
--- /dev/null
+++ b/app/src/main/res/layout/activity_elf_dialog_web_view.xml
@@ -0,0 +1,99 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_fairy_prize_hint.xml b/app/src/main/res/layout/item_fairy_prize_hint.xml
new file mode 100644
index 000000000..21c8b83bd
--- /dev/null
+++ b/app/src/main/res/layout/item_fairy_prize_hint.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/layout_room_effect.xml b/app/src/main/res/layout/layout_room_effect.xml
index d01715fb6..e7b06b490 100644
--- a/app/src/main/res/layout/layout_room_effect.xml
+++ b/app/src/main/res/layout/layout_room_effect.xml
@@ -59,6 +59,13 @@
app:layout_constraintDimensionRatio="75:11"
app:layout_constraintTop_toTopOf="parent" />
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_exchange.xml b/app/src/main/res/layout/treasure_fairy_dialog_exchange.xml
new file mode 100644
index 000000000..3d6321992
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_exchange.xml
@@ -0,0 +1,111 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_exchange_record.xml b/app/src/main/res/layout/treasure_fairy_dialog_exchange_record.xml
new file mode 100644
index 000000000..93d9aa556
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_exchange_record.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_forest.xml b/app/src/main/res/layout/treasure_fairy_dialog_forest.xml
new file mode 100644
index 000000000..dd772bf21
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_forest.xml
@@ -0,0 +1,303 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_forest_prize.xml b/app/src/main/res/layout/treasure_fairy_dialog_forest_prize.xml
new file mode 100644
index 000000000..bd51dc430
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_forest_prize.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_forest_record.xml b/app/src/main/res/layout/treasure_fairy_dialog_forest_record.xml
new file mode 100644
index 000000000..efae2195d
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_forest_record.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_home.xml b/app/src/main/res/layout/treasure_fairy_dialog_home.xml
new file mode 100644
index 000000000..e3eb83ec6
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_home.xml
@@ -0,0 +1,338 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_home_prize.xml b/app/src/main/res/layout/treasure_fairy_dialog_home_prize.xml
new file mode 100644
index 000000000..9c13cbdd7
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_home_prize.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_my_fairy.xml b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy.xml
new file mode 100644
index 000000000..d6aa3f59f
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_record.xml b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_record.xml
new file mode 100644
index 000000000..f3667f804
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_record.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_search_friend.xml b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_search_friend.xml
new file mode 100644
index 000000000..d70214bf9
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_search_friend.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_send.xml b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_send.xml
new file mode 100644
index 000000000..ae705bd1f
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_my_fairy_send.xml
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_test_fairy.xml b/app/src/main/res/layout/treasure_fairy_dialog_test_fairy.xml
new file mode 100644
index 000000000..7b4eec2c4
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_test_fairy.xml
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_test_fairy_record.xml b/app/src/main/res/layout/treasure_fairy_dialog_test_fairy_record.xml
new file mode 100644
index 000000000..c18b293ce
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_test_fairy_record.xml
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_dialog_test_fairy_result.xml b/app/src/main/res/layout/treasure_fairy_dialog_test_fairy_result.xml
new file mode 100644
index 000000000..8d0f43b48
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_dialog_test_fairy_result.xml
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_exchange_debris.xml b/app/src/main/res/layout/treasure_fairy_fragment_exchange_debris.xml
new file mode 100644
index 000000000..b5dd2b8ba
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_exchange_debris.xml
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_exchange_fairy.xml b/app/src/main/res/layout/treasure_fairy_fragment_exchange_fairy.xml
new file mode 100644
index 000000000..4d3f6aedd
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_exchange_fairy.xml
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_exchange_record_debris.xml b/app/src/main/res/layout/treasure_fairy_fragment_exchange_record_debris.xml
new file mode 100644
index 000000000..b69c7f535
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_exchange_record_debris.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_exchange_record_fairy.xml b/app/src/main/res/layout/treasure_fairy_fragment_exchange_record_fairy.xml
new file mode 100644
index 000000000..77680e2b6
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_exchange_record_fairy.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_forest_prizes.xml b/app/src/main/res/layout/treasure_fairy_fragment_forest_prizes.xml
new file mode 100644
index 000000000..3798f6f76
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_forest_prizes.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_forest_prizes_child.xml b/app/src/main/res/layout/treasure_fairy_fragment_forest_prizes_child.xml
new file mode 100644
index 000000000..8a75697aa
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_forest_prizes_child.xml
@@ -0,0 +1,7 @@
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_forest_record.xml b/app/src/main/res/layout/treasure_fairy_fragment_forest_record.xml
new file mode 100644
index 000000000..da1f34375
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_forest_record.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_my_fairy.xml b/app/src/main/res/layout/treasure_fairy_fragment_my_fairy.xml
new file mode 100644
index 000000000..38a090892
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_my_fairy.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_fragment_test_fairy.xml b/app/src/main/res/layout/treasure_fairy_fragment_test_fairy.xml
new file mode 100644
index 000000000..cf0a1305f
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_fragment_test_fairy.xml
@@ -0,0 +1,145 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_item_exchange.xml b/app/src/main/res/layout/treasure_fairy_item_exchange.xml
new file mode 100644
index 000000000..711371681
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_exchange.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_item_exchange_debris.xml b/app/src/main/res/layout/treasure_fairy_item_exchange_debris.xml
new file mode 100644
index 000000000..983404021
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_exchange_debris.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_exchange_debris_record.xml b/app/src/main/res/layout/treasure_fairy_item_exchange_debris_record.xml
new file mode 100644
index 000000000..8feb607ff
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_exchange_debris_record.xml
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_exchange_fairy_record.xml b/app/src/main/res/layout/treasure_fairy_item_exchange_fairy_record.xml
new file mode 100644
index 000000000..bc3b5f571
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_exchange_fairy_record.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_forest_prize.xml b/app/src/main/res/layout/treasure_fairy_item_forest_prize.xml
new file mode 100644
index 000000000..b4c3fdc49
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_forest_prize.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_forest_prize_single.xml b/app/src/main/res/layout/treasure_fairy_item_forest_prize_single.xml
new file mode 100644
index 000000000..e386445b0
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_forest_prize_single.xml
@@ -0,0 +1,39 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_forest_prizes_child.xml b/app/src/main/res/layout/treasure_fairy_item_forest_prizes_child.xml
new file mode 100644
index 000000000..7c066e95a
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_forest_prizes_child.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_item_forest_prizes_record.xml b/app/src/main/res/layout/treasure_fairy_item_forest_prizes_record.xml
new file mode 100644
index 000000000..bc3b5f571
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_forest_prizes_record.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_home.xml b/app/src/main/res/layout/treasure_fairy_item_home.xml
new file mode 100644
index 000000000..c1656a025
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_home.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_item_home_prize.xml b/app/src/main/res/layout/treasure_fairy_item_home_prize.xml
new file mode 100644
index 000000000..c56cbb690
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_home_prize.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_home_prize_single.xml b/app/src/main/res/layout/treasure_fairy_item_home_prize_single.xml
new file mode 100644
index 000000000..03456fb7a
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_home_prize_single.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_my_fairy_base.xml b/app/src/main/res/layout/treasure_fairy_item_my_fairy_base.xml
new file mode 100644
index 000000000..611405c23
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_my_fairy_base.xml
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_my_fairy_epic.xml b/app/src/main/res/layout/treasure_fairy_item_my_fairy_epic.xml
new file mode 100644
index 000000000..7beae7a31
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_my_fairy_epic.xml
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_my_fairy_friend.xml b/app/src/main/res/layout/treasure_fairy_item_my_fairy_friend.xml
new file mode 100644
index 000000000..33a00b8f2
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_my_fairy_friend.xml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_my_fairy_legend.xml b/app/src/main/res/layout/treasure_fairy_item_my_fairy_legend.xml
new file mode 100644
index 000000000..0144fbcc2
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_my_fairy_legend.xml
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_my_fairy_record.xml b/app/src/main/res/layout/treasure_fairy_item_my_fairy_record.xml
new file mode 100644
index 000000000..89ac4b9d5
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_my_fairy_record.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_item_test_fairy.xml b/app/src/main/res/layout/treasure_fairy_item_test_fairy.xml
new file mode 100644
index 000000000..28a1207da
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_test_fairy.xml
@@ -0,0 +1,71 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/treasure_fairy_item_test_fairy_record.xml b/app/src/main/res/layout/treasure_fairy_item_test_fairy_record.xml
new file mode 100644
index 000000000..97d1b83a4
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_item_test_fairy_record.xml
@@ -0,0 +1,69 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/treasure_fairy_popup_window_home_more.xml b/app/src/main/res/layout/treasure_fairy_popup_window_home_more.xml
new file mode 100644
index 000000000..c311cf97e
--- /dev/null
+++ b/app/src/main/res/layout/treasure_fairy_popup_window_home_more.xml
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
index 3e8880722..53344ba7b 100644
--- a/app/src/main/res/values/colors.xml
+++ b/app/src/main/res/values/colors.xml
@@ -657,5 +657,8 @@
#E1FAFF
#BE5AF6
#F92020
+ #1f5764
+ #59fdff
+ #ffe8aa
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index aefa884d7..04d593691 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -5089,5 +5089,16 @@
確定拒绝該用戶加入房間的申請嗎?
7天内不再接受該用戶的申請
確定拒绝該房間的加入邀請嗎?
+ 兌換
+ 初級召喚
+ 史詩召喚
+ 傳說召喚
+ 精靈球
+ 初級森林
+ 史詩森林
+ 傳說森林
+ 我是個默認簽名
+ 你
+ 贈送
\ No newline at end of file
diff --git a/app/src/module_community/java/com/yizhuan/erban/community/square/SquareDynamicFragment.java b/app/src/module_community/java/com/yizhuan/erban/community/square/SquareDynamicFragment.java
index 91d2378e8..41c4fcece 100644
--- a/app/src/module_community/java/com/yizhuan/erban/community/square/SquareDynamicFragment.java
+++ b/app/src/module_community/java/com/yizhuan/erban/community/square/SquareDynamicFragment.java
@@ -253,7 +253,7 @@ public class SquareDynamicFragment extends BaseMvpFragment loadMembers(false), recyclerView);
diff --git a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminAddActivity.kt b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminAddActivity.kt
index 223d8f481..68649177a 100644
--- a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminAddActivity.kt
+++ b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminAddActivity.kt
@@ -37,7 +37,7 @@ class SuperAdminAddActivity : BaseViewBindingActivity()
.setLayoutManager(LinearLayoutManager(context))
.setRecyclerView(binding.recyclerView)
- .setEmptyView(EmptyViewHelper.createEmptyView(context, ResUtil.getString(R.string.hall_activity_superadminaddactivity_01)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context, ResUtil.getString(R.string.hall_activity_superadminaddactivity_01)))
.setAdapter(adminAdapter)
.build()
diff --git a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminManageActivity.kt b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminManageActivity.kt
index 67216042f..aea931684 100644
--- a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminManageActivity.kt
+++ b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/activity/SuperAdminManageActivity.kt
@@ -49,7 +49,7 @@ class SuperAdminManageActivity : BaseViewBindingActivity()
.setLayoutManager(LinearLayoutManager(context))
.setRecyclerView(binding.recyclerView)
- .setEmptyView(EmptyViewHelper.createEmptyView(context, ResUtil.getString(R.string.hall_activity_superadminroomsetactivity_02)))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(context, ResUtil.getString(R.string.hall_activity_superadminroomsetactivity_02)))
.setAdapter(adminAdapter)
.build()
binding.recyclerView.itemAnimator = null
diff --git a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/adapter/ManageSuperAdminAdapter.kt b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/adapter/ManageSuperAdminAdapter.kt
index 24e236a12..b59396135 100644
--- a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/adapter/ManageSuperAdminAdapter.kt
+++ b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/adapter/ManageSuperAdminAdapter.kt
@@ -32,7 +32,7 @@ class ManageSuperAdminAdapter :
)
)
.setRecyclerView(rvRoom)
- .setEmptyView(EmptyViewHelper.createEmptyView(mContext, "暫無管理的房間"))
+ .setEmptyView(EmptyViewHelper.createEmptyTextView(mContext, "暫無管理的房間"))
.setAdapter(ManageRoomAdapter())
.build()
}
diff --git a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationFragment.kt b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationFragment.kt
index b9d3a2e56..a3a8bd769 100644
--- a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationFragment.kt
+++ b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationFragment.kt
@@ -77,7 +77,7 @@ class AssociationFragment : BaseViewBindingFragment(
.setLayoutManager(LinearLayoutManager(context))
.setRecyclerView(binding.recyclerView)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.association_list_empty)
)
diff --git a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationRoomFragment.kt b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationRoomFragment.kt
index f7f59189a..db56d96c5 100644
--- a/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationRoomFragment.kt
+++ b/app/src/module_labour_union/java/com/yizhuan/erban/module_hall/hall/fragment/AssociationRoomFragment.kt
@@ -151,7 +151,7 @@ class AssociationRoomFragment : BaseViewBindingFragment()
.setLayoutManager(LinearLayoutManager(context))
.setRecyclerView(binding.recyclerView)
.setEmptyView(
- EmptyViewHelper.createEmptyView(
+ EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.association_list_empty)
)
diff --git a/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/widget/GoldBoxHelper.java b/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/widget/GoldBoxHelper.java
index af63fc901..d13ca18fb 100644
--- a/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/widget/GoldBoxHelper.java
+++ b/app/src/module_treasure_box/java/com/yizhuan/erban/treasure_box/widget/GoldBoxHelper.java
@@ -11,6 +11,7 @@ import com.yizhuan.erban.treasure_box.activity.TreasureBoxActivity;
import com.yizhuan.erban.treasure_box.activity.TreasureBoxHonourActivity;
import com.yizhuan.erban.treasure_box.fragment.ChooseTreasureBoxDialogFragment;
import com.yizhuan.xchat_android_core.initial.InitialModel;
+import com.yizhuan.xchat_android_core.initial.bean.FairyOpenInfo;
import com.yizhuan.xchat_android_core.initial.bean.InitInfo;
import com.yizhuan.xchat_android_core.level.UserLevelVo;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
@@ -108,4 +109,12 @@ public class GoldBoxHelper {
return false;
}
+ public static boolean isShowFairy() {
+ UserInfo userInfo = UserModel.get().getCacheLoginUserInfo();
+ FairyOpenInfo fairyOpenInfo = InitialModel.get().getFairyOpenInfo();
+ if (fairyOpenInfo == null || userInfo == null) return false;
+
+ return fairyOpenInfo.isOpen() && userInfo.getUserLevelVo().getExperLevelSeq() >= fairyOpenInfo.getLevelLimit();
+ }
+
}
diff --git a/app/src/module_treasure_box/res/drawable/bg_treasure_box_more.xml b/app/src/module_treasure_box/res/drawable/bg_treasure_box_more.xml
new file mode 100644
index 000000000..bc3e0c6d5
--- /dev/null
+++ b/app/src/module_treasure_box/res/drawable/bg_treasure_box_more.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java
index fd33b1299..c6d355f2d 100644
--- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/UriProvider.java
@@ -526,4 +526,32 @@ public class UriProvider {
return JAVA_WEB_URL.concat("peko/modules/myincome/index.html#/GoldLog");
}
+ /**
+ * 获取夺宝精灵钥匙
+ */
+ public static String getFairyKey() {
+ return JAVA_WEB_URL.concat("yinyou/modules/act-treasureSnatching/index.html");
+ }
+
+ /**
+ * 夺宝精灵规则
+ */
+ public static String getFairyRule() {
+ return JAVA_WEB_URL.concat("yinyou/modules/act-treasureSnatching/rule.html");
+ }
+
+ /**
+ * 夺宝达人
+ */
+ public static String getFairySuperior() {
+ return JAVA_WEB_URL.concat("yinyou/modules/act-treasureSnatching/list.html");
+ }
+
+ /**
+ * 夺宝记录
+ */
+ public static String getFairyRecord() {
+ return JAVA_WEB_URL.concat("yinyou/modules/act-treasureSnatching/record.html");
+ }
+
}
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/bean/BannerInfo.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/bean/BannerInfo.java
index ed3d1fce5..ee45c7f8f 100644
--- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/bean/BannerInfo.java
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/home/bean/BannerInfo.java
@@ -59,6 +59,7 @@ public class BannerInfo implements Parcelable, Serializable {
private boolean isFirstCharge;
private boolean isBox;
private boolean isRadish;
+ private boolean isFairy;
public BannerInfo(){
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java
index fbc225f2c..99106b1d4 100644
--- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java
@@ -1347,6 +1347,28 @@ public final class IMNetEaseManager {
EventBus.getDefault().post(new UpdateKnapFreeGiftDataEvent(bean));
}
break;
+ case CUSTOM_MSG_FAIRY:
+ if (second != CUSTOM_MSG_SUB_FAIRY_SEND && second != CUSTOM_MSG_SUB_FAIRY_ASK_FOR) {
+ addMessages(msg);
+ }
+ switch (second) {
+ case CUSTOM_MSG_SUB_DRAW_GIFT_L4:
+ noticeRoomEvent(msg, RoomEvent.FAIRY_DRAW_GIFT_L4);
+ break;
+ case CUSTOM_MSG_SUB_DRAW_GIFT_L5:
+ noticeRoomEvent(msg, RoomEvent.FAIRY_DRAW_GIFT_L5);
+ break;
+ case CUSTOM_MSG_SUB_CONVERT_L1:
+ noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L1);
+ break;
+ case CUSTOM_MSG_SUB_CONVERT_L2:
+ noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L2);
+ break;
+ case CUSTOM_MSG_SUB_CONVERT_L3:
+ noticeRoomEvent(msg, RoomEvent.FAIRY_CONVERT_L3);
+ break;
+ }
+ break;
default:
break;
}
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/Compound.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/Compound.kt
new file mode 100644
index 000000000..2c7c43aec
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/Compound.kt
@@ -0,0 +1,6 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class Compound(
+ val elfId: Long,
+ val elfNum: Int
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/DrawInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/DrawInfo.kt
new file mode 100644
index 000000000..5a5460ba9
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/DrawInfo.kt
@@ -0,0 +1,7 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class DrawInfo(
+ val drawTicketNum: Int = 0,
+ val luckyNum: Int = 0,
+ val needLuckyNum: Int = 0
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/ExchangeGiftInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/ExchangeGiftInfo.kt
new file mode 100644
index 000000000..97e789610
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/ExchangeGiftInfo.kt
@@ -0,0 +1,34 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class ExchangeGiftInfo(
+ val expendNum: Int = 0,
+ val itemId: Long = 0,
+ val level: Int = 0,
+ val rewardId: Int = 0,
+ val rewardName: String = "",
+ val rewardNum: Int = 0,
+ val rewardPicUrl: String = "",
+ val rewardShowValue: String = "",
+ val rewardUnit: String = "",
+ val rewardType: String = "",
+ val type: Int = 0,
+ val createTime: Long = 0,
+ val convertLevel: Int = 0
+) {
+
+ fun getPrizeName(): String {
+ return if (rewardType == "gift") {
+ "${rewardName}(${rewardShowValue}钻)"
+ } else {
+ "${rewardName}(${rewardNum}${rewardUnit})"
+ }
+ }
+
+ fun getPrizeUnit(): String {
+ return if (rewardType == "gift") {
+ "${rewardShowValue}钻"
+ } else {
+ "${rewardNum}${rewardUnit}"
+ }
+ }
+}
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyInfo.kt
new file mode 100644
index 000000000..0aae4254b
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyInfo.kt
@@ -0,0 +1,12 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+import java.io.Serializable
+
+data class FairyInfo(
+ val elfId: Long = 0,
+ val elfNum: Int = 0,
+ val elfLevel: Int = 0,
+ val elfName: String = "",
+ val elfPicUrl: String = "",
+ var selectedNum:Int
+) : Serializable
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyMsgInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyMsgInfo.kt
new file mode 100644
index 000000000..86424f216
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyMsgInfo.kt
@@ -0,0 +1,48 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class FairyMsgInfo(
+ /**
+ * uid
+ */
+ val uid: Long? = null,
+
+ /**
+ * 昵称
+ */
+ val nick: String? = null,
+
+ /**
+ * 所在房间uid
+ */
+ val roomUid: Long? = null,
+
+ /**
+ * 奖励类型
+ */
+ val rewardType: String? = null,
+
+ /**
+ * 奖励名称
+ */
+ val rewardName: String? = null,
+
+ /**
+ * 奖励等级
+ */
+ val rewardLevel: Int? = null,
+
+ /**
+ * 奖励数量
+ */
+ val rewardNum: Int = 0,
+
+ /**
+ * 限制等级
+ */
+ val userLevelLimit: Int? = null,
+
+ /**
+ * 展示价值
+ */
+ val rewardShowValue: Int? = null
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyTestParam.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyTestParam.kt
new file mode 100644
index 000000000..b08420198
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/FairyTestParam.kt
@@ -0,0 +1,6 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class FairyTestParam(
+ val expendList: MutableList = arrayListOf(),
+ var level: Int = 0,
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/ForestInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/ForestInfo.kt
new file mode 100644
index 000000000..7ab08e2c2
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/ForestInfo.kt
@@ -0,0 +1,11 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class ForestInfo(
+ val avatar: String = "",
+ val erbanNo: Int = 0,
+ val highBallNum: String = "0",
+ val lowBallNum: String = "0",
+ val middleBallNum: String = "0",
+ val nick: String = "",
+ val uid: Int = 0
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/MyFairyInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/MyFairyInfo.kt
new file mode 100644
index 000000000..870854599
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/MyFairyInfo.kt
@@ -0,0 +1,10 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class MyFairyInfo(
+ val highElves: ArrayList? = null,
+ val lowElves: ArrayList? = null,
+ val middleElves: ArrayList? = null,
+ val avatar: String = "",
+ val nick: String = "",
+ val chipNum: Int
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/PrizeInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/PrizeInfo.kt
new file mode 100644
index 000000000..d3989993e
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/PrizeInfo.kt
@@ -0,0 +1,16 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class PrizeInfo(
+ val rewardId: Int = 0,
+ val rewardName: String = "",
+ val rewardNum: Int = 0,
+ val rewardOrder: Int = 0,
+ val rewardLevel: Int = 0,
+ val rewardPicUrl: String = "",
+ val rewardType: String = "",
+ val rewardUnit: String = "",
+ val drawTime: Long = 0,
+ val poolLevel: Int = 0,
+ val propType: Int? = null,
+ val itemIndex:Int = 0,
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/SendFairyInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/SendFairyInfo.kt
new file mode 100644
index 000000000..e0c282dbc
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/SendFairyInfo.kt
@@ -0,0 +1,13 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class SendFairyInfo(
+ val createTime: Long = 0,
+ val elfId: Long = 0,
+ val elfName: String = "",
+ val elfPicUrl: String = "",
+ val recordId: Int = 0,
+ val targetAvatar: String = "",
+ val targetNick: String = "",
+ val targetUid: Long = 0,
+ val type: Int = 0
+)
\ No newline at end of file
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/TestFairyRecordInfo.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/TestFairyRecordInfo.kt
new file mode 100644
index 000000000..25d2f72af
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/TestFairyRecordInfo.kt
@@ -0,0 +1,10 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+data class TestFairyRecordInfo(
+ val compoundLevel: Int = 0,
+ val createTime: Long = 0,
+ val elfLevel: Int = 0,
+ val elfName: String = "",
+ val expendList: List = listOf(),
+ val recordId: Long = 0
+)
diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/TreasureFairyModel.kt b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/TreasureFairyModel.kt
new file mode 100644
index 000000000..48ae99265
--- /dev/null
+++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/treasurefairy/TreasureFairyModel.kt
@@ -0,0 +1,264 @@
+package com.yizhuan.xchat_android_core.treasurefairy
+
+import com.yizhuan.xchat_android_core.bean.response.ServiceResult
+import com.yizhuan.xchat_android_core.gift.bean.SimpleUserInfo
+import com.yizhuan.xchat_android_core.manager.AvRoomDataManager
+import com.yizhuan.xchat_android_core.utils.net.launchRequest
+import com.yizhuan.xchat_android_library.net.rxnet.RxNet
+import retrofit2.http.*
+
+object TreasureFairyModel {
+
+ private val api = RxNet.create(Api::class.java)
+
+ suspend fun drawTreasureFairy(drawNum: Int): List? = launchRequest {
+ api.drawTreasureFairy(drawNum, AvRoomDataManager.get().roomUid)
+ }
+
+ suspend fun getDrawInfo(): DrawInfo? = launchRequest {
+ api.getDrawInfo()
+ }
+
+ suspend fun getPrizeInfoList(): List? = launchRequest {
+ api.getPrizeInfoList()
+ }
+
+ suspend fun drawForestFairy(drawNum: Int, poolLevel: Int): List? = launchRequest {
+ api.drawForestFairy(drawNum, poolLevel)
+ }
+
+ suspend fun getForestRecord(
+ page: Int,
+ pageSize: Int
+ ): List? = launchRequest {
+ api.getForestRecord(page, pageSize)
+ }
+
+ suspend fun getForestPrizePool(poolLevel: Int): List? = launchRequest {
+ api.getForestPrizePool(poolLevel)
+ }
+
+ suspend fun getForestInfo(): ForestInfo? = launchRequest {
+ api.getForestInfo()
+ }
+
+ suspend fun getMyFairyInfo(): MyFairyInfo? = launchRequest {
+ api.getMyFairyInfo()
+ }
+
+ suspend fun getFriendsList(nick: String?): List? = launchRequest {
+ api.getFriendsList(nick)
+ }
+
+ suspend fun askForFairy(elfId: Long, targetUid: Long): String? = launchRequest {
+ api.askForFairy(elfId, targetUid)
+ }
+
+ suspend fun sendFairy(elfId: Long, targetUid: Long): String? = launchRequest {
+ api.sendFairy(elfId, targetUid)
+ }
+
+ suspend fun getSendFairyList(
+ page: Int,
+ pageSize: Int
+ ): List? = launchRequest {
+ api.getSendFairyList(page, pageSize)
+ }
+
+ suspend fun testFairy(fairyTestParam: FairyTestParam): FairyInfo? = launchRequest {
+ api.testFairy(fairyTestParam)
+ }
+
+ suspend fun getTestFairyRecordList(
+ page: Int,
+ pageSize: Int
+ ): List? = launchRequest {
+ api.getTestFairyRecordList(page, pageSize)
+ }
+
+ suspend fun getExchangeGiftInfoList(): List? = launchRequest {
+ api.getExchangeGiftInfoList()
+ }
+
+ suspend fun exchangeGift(itemId: Long): ExchangeGiftInfo? = launchRequest {
+ api.exchangeGift(itemId, AvRoomDataManager.get().roomUid)
+ }
+
+ suspend fun getDebrisExchangeList(): List? = launchRequest {
+ api.getDebrisExchangeList()
+ }
+
+ suspend fun getExchangeRecord(
+ convertType: Int,
+ page: Int,
+ pageSize: Int
+ ): List? = launchRequest {
+ api.getExchangeRecord(convertType, page, pageSize)
+ }
+
+
+ private interface Api {
+
+ /**
+ * 夺宝
+ *
+ * @param drawNum
+ * @return
+ */
+ @FormUrlEncoded
+ @POST("act/seize-treasure/draw")
+ suspend fun drawTreasureFairy(
+ @Field("drawNum") drawNum: Int,
+ @Field("roomUid") roomUid: Long
+ ): ServiceResult>
+
+ @GET("act/seize-treasure/user/draw/info")
+ suspend fun getDrawInfo(): ServiceResult
+
+ /**
+ * 奖池列表
+ *
+ */
+ @GET("act/seize-treasure/draw/pool/list")
+ suspend fun getPrizeInfoList(): ServiceResult>
+
+ /**
+ * 猛犸森林抽奖
+ *
+ */
+ @FormUrlEncoded
+ @POST("act/seize-treasure/forest/draw")
+ suspend fun drawForestFairy(
+ @Field("drawNum") drawNum: Int,
+ @Field("poolLevel") poolLevel: Int
+ ): ServiceResult>
+
+ /**
+ * 猛犸森林抽奖记录
+ *
+ */
+ @GET("act/seize-treasure/forest/draw/record")
+ suspend fun getForestRecord(
+ @Query("page") page: Int,
+ @Query("pageSize") pageSize: Int
+ ): ServiceResult>
+
+ /**
+ *
+ * 猛犸森林奖池配置列表
+ *
+ */
+ @GET("act/seize-treasure/draw/forest/item")
+ suspend fun getForestPrizePool(@Query("poolLevel") poolLevel: Int): ServiceResult>
+
+ /**
+ *
+ * 猛犸森林奖池配置列表
+ *
+ */
+ @GET("act/seize-treasure/user/forest/info")
+ suspend fun getForestInfo(): ServiceResult
+
+ /**
+ *
+ * 获取我的精灵信息
+ *
+ */
+ @GET("act/seize-treasure/elf/user/info")
+ suspend fun getMyFairyInfo(): ServiceResult
+
+ /**
+ *
+ * 好友列表
+ *
+ */
+ @GET("fans/friend/list")
+ suspend fun getFriendsList(@Query("nick") nick: String?): ServiceResult>
+
+ /**
+ * 精灵-索要
+ *
+ */
+ @FormUrlEncoded
+ @POST("act/seize-treasure/elf/askFor")
+ suspend fun askForFairy(
+ @Field("elfId") elfId: Long,
+ @Field("targetUid") targetUid: Long
+ ): ServiceResult
+
+ /**
+ * 精灵-赠送
+ *
+ */
+ @FormUrlEncoded
+ @POST("act/seize-treasure/elf/send")
+ suspend fun sendFairy(
+ @Field("elfId") elfId: Long,
+ @Field("targetUid") targetUid: Long
+ ): ServiceResult
+
+ /**
+ * 精灵-赠予/获赠记录
+ *
+ */
+ @GET("act/seize-treasure/elf/record")
+ suspend fun getSendFairyList(
+ @Query("page") page: Int,
+ @Query("pageSize") pageSize: Int
+ ): ServiceResult>
+
+ /**
+ * 合成礼物
+ */
+ @POST("act/seize-treasure/elf/compound")
+ suspend fun testFairy(@Body fairyTestParam: FairyTestParam): ServiceResult
+
+ /**
+ * 合成礼物记录
+ *
+ */
+ @GET("act/seize-treasure/elf/compound/record")
+ suspend fun getTestFairyRecordList(
+ @Query("page") page: Int,
+ @Query("pageSize") pageSize: Int
+ ): ServiceResult>
+
+ /**
+ * 精灵兑换-礼物列表
+ *
+ */
+ @GET("act/seize-treasure/convert/elf/list")
+ suspend fun getExchangeGiftInfoList(): ServiceResult>
+
+ /**
+ * 精灵兑换-兑换
+ *
+ */
+ @FormUrlEncoded
+ @POST("act/seize-treasure/convert")
+ suspend fun exchangeGift(
+ @Field("itemId") itemId: Long,
+ @Field("roomUid") roomUid: Long
+ ): ServiceResult
+
+
+ /**
+ * 兑换-碎片兑换列表
+ *
+ */
+ @GET("act/seize-treasure/convert/chip/list")
+ suspend fun getDebrisExchangeList(): ServiceResult>
+
+ /**
+ * 猛犸森林抽奖记录
+ *
+ */
+ @GET("act/seize-treasure/convert/record")
+ suspend fun getExchangeRecord(
+ @Query("convertType") convertType: Int,
+ @Query("page") page: Int,
+ @Query("pageSize") pageSize: Int
+ ): ServiceResult>
+ }
+
+}
\ No newline at end of file
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java b/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java
index b05a42a64..81748062a 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/DemoCache.java
@@ -58,6 +58,7 @@ public class DemoCache {
private static final String KEY_RADISH_TIPS = "key_radish_tips";
private static final String KEY_KICK_OUT_ROOM = "kick_out_room";
private static final String KEY_BOUND_AUTH_CODE = "key_bound_auth_code";
+ private static final String KEY_MY_FAIRY_INDEX = "key_my_fairy_index";
private static StatusBarNotificationConfig notificationConfig;
@@ -335,4 +336,12 @@ public class DemoCache {
return SettingsPref.instance().getBoolean(KEY_BOUND_AUTH_CODE, false);
}
+ public static void saveMyFairyIndex(int index) {
+ SettingsPref.instance().putInt(KEY_MY_FAIRY_INDEX, index);
+ }
+
+ public static int readMyFairyIndex() {
+ return SettingsPref.instance().getInt(KEY_MY_FAIRY_INDEX, 0);
+ }
+
}
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/gift/bean/SimpleUserInfo.kt b/core/src/main/java/com/yizhuan/xchat_android_core/gift/bean/SimpleUserInfo.kt
index fd40f4d8e..61b7ed315 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/gift/bean/SimpleUserInfo.kt
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/gift/bean/SimpleUserInfo.kt
@@ -3,8 +3,9 @@ package com.yizhuan.xchat_android_core.gift.bean
import java.io.Serializable
data class SimpleUserInfo(
- val nick: String? = null,
+ val nick: String = "",
val uid: Long = 0L,
val erbanNo: Long = 0L,
- val avatar: String? = null
+ val avatar: String = "",
+ val userDesc: String = ""
) : Serializable
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java
index d33381531..d48b902db 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachParser.java
@@ -18,6 +18,7 @@ import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUS
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_DRAW_GIFT_EFFECT;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_EXPER_LEVEL_UP;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_EXPER_LEVEL_UP_NOTICE;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_FAIRY;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_MEMBER_COUNT;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_ROOM_NOTIFY;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_GROUP_CHAT_TOPIC;
@@ -50,6 +51,8 @@ import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUS
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SIGN_IN;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CLANAPPLY;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_CLANNORMAL;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_FAIRY_ASK_FOR;
+import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_FAIRY_SEND;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_HALL_APPLY_EXIT;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_HALL_APPLY_JOIN;
import static com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment.CUSTOM_MSG_SUB_HALL_MANAGER_INVITE;
@@ -632,6 +635,14 @@ public class CustomAttachParser implements MsgAttachmentParser {
attachment = new RoomFreeGiftAttachment(first, second);
}
break;
+ case CUSTOM_MSG_FAIRY:
+ if (second == CUSTOM_MSG_SUB_FAIRY_SEND ||
+ second == CUSTOM_MSG_SUB_FAIRY_ASK_FOR) {
+ attachment = new FairySendAttachment(first, second);
+ } else {
+ attachment = new FairyMsgAttachment(first, second);
+ }
+ break;
default:
LogUtils.e(ResUtil.getString(R.string.custom_bean_customattachparser_01) + first + " second=" + second);
break;
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java
index dbcd6a8e0..a4fea80e0 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/CustomAttachment.java
@@ -428,6 +428,24 @@ public class CustomAttachment implements MsgAttachment {
public static final int ROOM_FREE_GIFT_REST = 960;
public static final int ROOM_FREE_GIFT_CHANGE = 961;
+ public static final int CUSTOM_MSG_FAIRY = 97; // 夺宝精灵
+ public static final int CUSTOM_MSG_SUB_FAIRY_SEND = 9701; // 赠送小精灵
+ public static final int CUSTOM_MSG_SUB_FAIRY_ASK_FOR = 9702; // 索要小精灵
+
+ public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L1 = 9711; // 抽奖L1礼物
+ public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L2 = 9712; // 抽奖L2礼物
+ public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L3 = 9713; // 抽奖L3礼物
+ public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L4 = 9714; // 抽奖L4礼物
+ public static final int CUSTOM_MSG_SUB_DRAW_GIFT_L5 = 9715; // 抽奖L5礼物
+
+ public static final int CUSTOM_MSG_SUB_DRAW_BALL_L1 = 9721; // 抽奖L1精灵球
+ public static final int CUSTOM_MSG_SUB_DRAW_BALL_L2 = 9722; // 抽奖L2精灵球
+ public static final int CUSTOM_MSG_SUB_DRAW_BALL_L3 = 9723; // 抽奖L3精灵球
+
+ public static final int CUSTOM_MSG_SUB_CONVERT_L1 = 9731; // 召唤L1
+ public static final int CUSTOM_MSG_SUB_CONVERT_L2 = 9732; // 召唤L2
+ public static final int CUSTOM_MSG_SUB_CONVERT_L3 = 9733; // 召唤L3
+
/**
* 自定义消息附件的类型,根据该字段区分不同的自定义消息
*/
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/FairyMsgAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/FairyMsgAttachment.java
new file mode 100644
index 000000000..f75953201
--- /dev/null
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/FairyMsgAttachment.java
@@ -0,0 +1,36 @@
+package com.yizhuan.xchat_android_core.im.custom.bean;
+
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.Gson;
+import com.yizhuan.xchat_android_core.treasurefairy.FairyMsgInfo;
+
+/**
+ * Created by chenran on 2017/10/4.
+ */
+
+public class FairyMsgAttachment extends CustomAttachment {
+ private FairyMsgInfo fairyMsgInfo;
+
+ public FairyMsgAttachment(int first, int second) {
+ super(first, second);
+ }
+
+ @Override
+ protected void parseData(JSONObject jsonObject) {
+ fairyMsgInfo = new Gson().fromJson(jsonObject.toJSONString(), FairyMsgInfo.class);
+ }
+
+ public FairyMsgInfo getFairyMsgInfo() {
+ return fairyMsgInfo;
+ }
+
+ public void setFairyMsgInfo(FairyMsgInfo fairyMsgInfo) {
+ this.fairyMsgInfo = fairyMsgInfo;
+ }
+
+ @Override
+ protected JSONObject packData() {
+ return null;
+ }
+
+}
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/FairySendAttachment.java b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/FairySendAttachment.java
new file mode 100644
index 000000000..380cc1eb5
--- /dev/null
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/im/custom/bean/FairySendAttachment.java
@@ -0,0 +1,104 @@
+package com.yizhuan.xchat_android_core.im.custom.bean;
+
+import com.alibaba.fastjson.JSONObject;
+
+/**
+ * Created by chenran on 2017/10/4.
+ */
+
+public class FairySendAttachment extends CustomAttachment {
+ private long uid;
+ private String nick;
+ private long targetUid;
+ private String targetNick;
+ private long elfId;
+ private String elfPicUrl;
+ private String elfName;
+ private String msgContent;
+
+ public FairySendAttachment(int first, int second) {
+ super(first, second);
+ }
+
+ @Override
+ protected void parseData(JSONObject jsonObject) {
+ uid = jsonObject.getLongValue("uid");
+ targetUid = jsonObject.getLongValue("targetUid");
+ elfId = jsonObject.getLongValue("elfId");
+ elfPicUrl = jsonObject.getString("elfPicUrl");
+ msgContent = jsonObject.getString("msgContent");
+ targetNick = jsonObject.getString("targetNick");
+ nick = jsonObject.getString("nick");
+ elfName = jsonObject.getString("elfName");
+ }
+
+ public long getUid() {
+ return uid;
+ }
+
+ public void setUid(long uid) {
+ this.uid = uid;
+ }
+
+ public long getTargetUid() {
+ return targetUid;
+ }
+
+ public void setTargetUid(long targetUid) {
+ this.targetUid = targetUid;
+ }
+
+ public long getElfId() {
+ return elfId;
+ }
+
+ public void setElfId(long elfId) {
+ this.elfId = elfId;
+ }
+
+ public String getElfPicUrl() {
+ return elfPicUrl;
+ }
+
+ public void setElfPicUrl(String elfPicUrl) {
+ this.elfPicUrl = elfPicUrl;
+ }
+
+ public String getMsgContent() {
+ return msgContent;
+ }
+
+ public void setMsgContent(String msgContent) {
+ this.msgContent = msgContent;
+ }
+
+ public String getTargetNick() {
+ return targetNick;
+ }
+
+ public void setTargetNick(String targetNick) {
+ this.targetNick = targetNick;
+ }
+
+ public String getElfName() {
+ return elfName;
+ }
+
+ public void setElfName(String elfName) {
+ this.elfName = elfName;
+ }
+
+ public String getNick() {
+ return nick;
+ }
+
+ public void setNick(String nick) {
+ this.nick = nick;
+ }
+
+ @Override
+ protected JSONObject packData() {
+ return null;
+ }
+
+}
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/initial/IInitialModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/initial/IInitialModel.java
index a8da261ee..f974a857d 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/initial/IInitialModel.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/initial/IInitialModel.java
@@ -10,6 +10,7 @@ import com.yizhuan.xchat_android_core.base.IModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.home.bean.MainTabInfo;
import com.yizhuan.xchat_android_core.initial.bean.BoxInfo;
+import com.yizhuan.xchat_android_core.initial.bean.FairyOpenInfo;
import com.yizhuan.xchat_android_core.initial.bean.InitInfo;
import java.util.List;
@@ -71,4 +72,10 @@ public interface IInitialModel extends IModel {
int getDynamicRefresh();
int getDefaultHomeTab();
+
+ Single requestFairyOpenInfo();
+
+ @Nullable
+ FairyOpenInfo getFairyOpenInfo();
+
}
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java b/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java
index ad0635660..d98958d3a 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/initial/InitialModel.java
@@ -17,17 +17,20 @@ import com.bumptech.glide.request.target.Target;
import com.netease.nim.uikit.support.glide.GlideApp;
import com.yizhuan.xchat_android_core.R;
import com.yizhuan.xchat_android_core.DemoCache;
+import com.yizhuan.xchat_android_core.auth.event.LogoutEvent;
import com.yizhuan.xchat_android_core.base.BaseModel;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.certification.CertificationModel;
import com.yizhuan.xchat_android_core.home.bean.MainTabInfo;
import com.yizhuan.xchat_android_core.home.bean.MainTabType;
import com.yizhuan.xchat_android_core.initial.bean.BoxInfo;
+import com.yizhuan.xchat_android_core.initial.bean.FairyOpenInfo;
import com.yizhuan.xchat_android_core.initial.bean.InitInfo;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.noble.NobleDataManager;
import com.yizhuan.xchat_android_core.public_chat_hall.manager.PublicChatHallDataManager;
import com.yizhuan.xchat_android_core.room.face.DynamicFaceModel;
+import com.yizhuan.xchat_android_core.user.event.LoadLoginUserInfoEvent;
import com.yizhuan.xchat_android_core.utils.CurrentTimeUtils;
import com.yizhuan.xchat_android_core.utils.SharedPreferenceUtils;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
@@ -39,6 +42,9 @@ import com.yizhuan.xchat_android_library.utils.NetworkUtils;
import com.yizhuan.xchat_android_library.utils.ResUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
@@ -116,6 +122,11 @@ public class InitialModel extends BaseModel implements IInitialModel {
* 发现萌新列表展示等级配置
*/
private int findNewbieCharmLevel;
+ /**
+ * 宝箱开关,等级限制
+ */
+ @Nullable
+ private FairyOpenInfo fairyOpenInfo;
@Nullable
private InitInfo cacheInitInfo;
@@ -156,6 +167,16 @@ public class InitialModel extends BaseModel implements IInitialModel {
return model;
}
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onLoadLoginUserInfoEvent(LoadLoginUserInfoEvent event) {
+ getFairyOpenInfo();
+ }
+
+ @Subscribe(threadMode = ThreadMode.MAIN)
+ public void onLogoutEvent(LogoutEvent event) {
+ fairyOpenInfo = null;
+ }
+
@Override
@NonNull
public LiveData> getMainTabInfosLiveData() {
@@ -519,6 +540,22 @@ public class InitialModel extends BaseModel implements IInitialModel {
return findNewbieCharmLevel;
}
+ @Override
+ public Single requestFairyOpenInfo() {
+ return api.getFairyOpenInfo()
+ .compose(RxHelper.handleCommon());
+ }
+
+ @Nullable
+ @Override
+ public FairyOpenInfo getFairyOpenInfo() {
+ //每次请求都刷新
+ requestFairyOpenInfo()
+ .doOnSuccess(fairyOpenInfo -> this.fairyOpenInfo = fairyOpenInfo)
+ .subscribe();
+ return fairyOpenInfo;
+ }
+
private interface Api {
/**
* 客户端初始化
@@ -545,5 +582,14 @@ public class InitialModel extends BaseModel implements IInitialModel {
*/
@GET("/app/bottomBar/getCurrentAppBottomBar")
Single>> getMainTabList();
+
+ /**
+ * 夺宝精灵开放状态
+ *
+ * @return -
+ */
+ @GET("act/seize-treasure/status")
+ Single> getFairyOpenInfo();
+
}
}
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/initial/bean/FairyOpenInfo.java b/core/src/main/java/com/yizhuan/xchat_android_core/initial/bean/FairyOpenInfo.java
new file mode 100644
index 000000000..033058bf7
--- /dev/null
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/initial/bean/FairyOpenInfo.java
@@ -0,0 +1,22 @@
+package com.yizhuan.xchat_android_core.initial.bean;
+
+public class FairyOpenInfo {
+ private int levelLimit;
+ private boolean open;
+
+ public int getLevelLimit() {
+ return levelLimit;
+ }
+
+ public void setLevelLimit(int levelLimit) {
+ this.levelLimit = levelLimit;
+ }
+
+ public boolean isOpen() {
+ return open;
+ }
+
+ public void setOpen(boolean open) {
+ this.open = open;
+ }
+}
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java
index e2c248aef..7e7c1ff2a 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/RoomEvent.java
@@ -252,6 +252,12 @@ public class RoomEvent {
//深海奇缘礼物全服飘屏通知
public static final int LUCKY_SEA_GIFT_SERVER_NOTIFY = 100;
+ public static final int FAIRY_DRAW_GIFT_L4 = 102;
+ public static final int FAIRY_DRAW_GIFT_L5 = 103;
+ public static final int FAIRY_CONVERT_L1 = 104;
+ public static final int FAIRY_CONVERT_L2 = 105;
+ public static final int FAIRY_CONVERT_L3 = 106;
+
private int event = NONE;
private int micPosition = Integer.MIN_VALUE;
private int posState = -1;
diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/statistic/protocol/StatisticsProtocol.java b/core/src/main/java/com/yizhuan/xchat_android_core/statistic/protocol/StatisticsProtocol.java
index d180c5c14..90479ff5c 100644
--- a/core/src/main/java/com/yizhuan/xchat_android_core/statistic/protocol/StatisticsProtocol.java
+++ b/core/src/main/java/com/yizhuan/xchat_android_core/statistic/protocol/StatisticsProtocol.java
@@ -618,6 +618,8 @@ public interface StatisticsProtocol {
String EVENT_USERCENTER_QUICK_ENTRYSUCCESS_CLICK = "usercenter_quick_entrysuccess_click";//个人中心快捷进房点击成功匹配
String EVENT_USERCENTER_BANNER_CLICK = "usercenter_banner_click";//个人中心banner模块点击
-
+ String EVENT_TREASURE_ELF_ENTRANCE_CLICK = "treasure_elf_entrance_click";//夺宝精灵主入口点击
+ String EVENT_TREASURE_ELF_SCREEN_ENTRANCE_CLICK = "treasure_elf_screen_entrance_click";//夺宝精灵公屏入口点击
+ String EVENT_TREASURE_ELF_LOTTERY_CLICK = "treasure_elf_lottery_click";//夺宝精灵抽奖点击
}
diff --git a/library/build.gradle b/library/build.gradle
index 435e15655..eb8cf599a 100644
--- a/library/build.gradle
+++ b/library/build.gradle
@@ -137,6 +137,8 @@ dependencies {
//流式布局
api 'com.google.android.flexbox:flexbox:3.0.0'
+ api 'io.github.razerdp:BasePopup:3.2.1'
+
}
repositories {
mavenCentral()