[Modify]夺宝精灵接入

This commit is contained in:
wushaocheng
2023-03-07 19:33:02 +08:00
parent 09db03bdfd
commit 115e7afea6
293 changed files with 8336 additions and 56 deletions

View File

@@ -969,6 +969,14 @@
android:exported="false"
android:screenOrientation="portrait" />
<activity
android:name=".treasurefairy.HomeFairyActivity"
android:theme="@style/dialog_web_view_activity" />
<activity
android:name=".ui.webview.FairyDialogWebViewActivity"
android:theme="@style/dialog_web_view_activity" />
<meta-data
android:name="notch.config"
android:value="portrait|landscape" />

View File

@@ -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<IAvRoomView, AvRoomPresenter
mVsNobleOpen = findViewById(R.id.vs_noble_open_notice);
vsTaskTips = findViewById(R.id.vs_task_tips);
viewpager = findViewById(R.id.fragment_container);
InitialModel.get().getFairyOpenInfo();
IMNetEaseManager.get().getChatRoomEventObservable()
.compose(bindToLifecycle())

View File

@@ -49,7 +49,7 @@ class RoomPKSearchActivity : BaseViewBindingActivity<ActivityRoomPkSearchBinding
rvDelegate = RVDelegate.Builder<SimpleRoomInfo>()
.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)

View File

@@ -55,12 +55,12 @@ public class HomePartyPresenter extends BaseRoomPresenter<IHomePartyView> {
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<IHomePartyView> {
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<IHomePartyView> {
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<IHomePartyView> {
return ChatRoomMessageBuilder.createChatRoomCustomMessage(
// 聊天室id
roomInfo.getRoomId() + "",
// 自定消息
// 自定消息
faceAttachment
);
}
@@ -178,13 +178,13 @@ public class HomePartyPresenter extends BaseRoomPresenter<IHomePartyView> {
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<FaceReceiveInfo> 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<IHomePartyView> {
/**
* 本地更新房主位信息或者关闭离线模式
* 本地更新房主位信息或者關閉離線模式
*/
@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<IHomePartyView> {
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<String>() {
@Override
@@ -273,7 +273,7 @@ public class HomePartyPresenter extends BaseRoomPresenter<IHomePartyView> {
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<IHomePartyView> {
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);

View File

@@ -45,6 +45,11 @@ public class SingleRoomPresenter extends BaseRoomPresenter<ISingleRoomView> {
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);

View File

@@ -46,7 +46,7 @@ class SingleRoomPKSearchActivity : BaseViewBindingActivity<ActivitySingleRoomPkS
roomPKSearchAdapter = SingleRoomPKSearchAdapter()
rvDelegate = RVDelegate.Builder<SimpleRoomInfo>()
.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)

View File

@@ -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) {

View File

@@ -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<ChatRoomMessage> by lazy { ArrayList() }
private var fairyAnimation: Animation? = null
private var fairyDisposable: Disposable? = null
private val fairyMessages: MutableList<Pair<Int, ChatRoomMessage>> 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<Int, ChatRoomMessage>) {
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<Int, ChatRoomMessage>) {
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
)
}
/**
* 幸運池飄屏
*

View File

@@ -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<out T>(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
}

View File

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

View File

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

View File

@@ -54,7 +54,7 @@ class DecorationCommonFragment : BaseViewBindingFragment<FragmentDecorationCommo
.setAdapter(decorationAdapter)
.setRecyclerView(binding.recyclerView)
.setRefreshLayout(binding.swipeRefresh)
.setEmptyView(EmptyViewHelper.createEmptyView(mContext, ResUtil.getString(R.string.decoration_view_decorationcommonfragment_01)))
.setEmptyView(EmptyViewHelper.createEmptyTextView(mContext, ResUtil.getString(R.string.decoration_view_decorationcommonfragment_01)))
.setLayoutManager(
if (dressType == DecorationStoreActivity.TAB_USER_CARD) {
LinearLayoutManager(mContext)

View File

@@ -64,7 +64,7 @@ class GoldDetailActivity : BaseViewBindingActivity<ActivityGoldDetailBinding>(),
.setLayoutManager(LinearLayoutManager(context))
.setRecyclerView(binding.mRecyclerView)
.setEmptyView(
EmptyViewHelper.createEmptyView(
EmptyViewHelper.createEmptyTextView(
context,
getString(R.string.empty_data)
)

View File

@@ -53,7 +53,7 @@ class FansTeamJoinedActivity : BaseViewBindingActivity<ActivityFansTeamJoinedBin
.setLayoutManager(LinearLayoutManager(this))
.setRecyclerView(binding.rvTask)
.setAdapter(FansTeamTaskAdapter())
.setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.erban_fansteam_fansteamjoinedactivity_01)))
.setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.erban_fansteam_fansteamjoinedactivity_01)))
.build()
binding.llRank.setOnClickListener {

View File

@@ -41,7 +41,7 @@ class FansTeamListActivity : BaseViewBindingActivity<ActivityFansTeamListBinding
.setRecyclerView(binding.recyclerView)
.setAdapter(FansTeamListAdapter())
.setPageSize(pageSize)
.setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.erban_fansteam_fansteamlistactivity_02)))
.setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.erban_fansteam_fansteamlistactivity_02)))
.build()
binding.swipeRefresh.setOnRefreshListener {

View File

@@ -50,7 +50,7 @@ class RoomHistoryListActivity : BaseViewBindingActivity<ActivityRoomHistoryListB
.setLayoutManager(LinearLayoutManager(this))
.setRecyclerView(binding.recyclerView)
.setAdapter(RoomHistoryListAdapter())
.setEmptyView(EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.home_activity_roomhistorylistactivity_06)))
.setEmptyView(EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.home_activity_roomhistorylistactivity_06)))
.build()
binding.swipeRefresh.setOnRefreshListener {

View File

@@ -44,7 +44,7 @@ class VisitorListActivity : BaseViewBindingActivity<ActivityVisitorListBinding>(
.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)

View File

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

View File

@@ -52,7 +52,7 @@ class RoomCommonFragment : BaseViewBindingFragment<FragmentRoomCommonBinding>()
.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()

View File

@@ -48,7 +48,7 @@ class RoomGameFragment : BaseViewBindingFragment<FragmentRoomGameBinding>() {
.setAdapter(roomHotAdapter)
.setRecyclerView(binding.recyclerView)
.setEmptyView(
EmptyViewHelper.createEmptyView(
EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.home_fragment_roomgamefragment_01)
)

View File

@@ -74,7 +74,7 @@ class RoomLikeFragment : BaseViewBindingFragment<FragmentRoomLikeBinding>() {
.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()

View File

@@ -72,7 +72,7 @@ class GiveGoldActivity : BaseViewBindingActivity<ActivityGiveGoldBinding>() {
.setLayoutManager(LinearLayoutManager(this))
.setPageSize(20)
.setEmptyView(
EmptyViewHelper.createEmptyView(
EmptyViewHelper.createEmptyTextView(
this,
ResUtil.getString(R.string.me_give_gold_empty)
)

View File

@@ -40,7 +40,7 @@ class GiveGoldSearchActivity : BaseActivity(), TextWatcher {
val adapter = GiveSearchAdapter()
rvDelegate = RVDelegate.Builder<SearchRoomInfo>()
.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)

View File

@@ -45,7 +45,7 @@ class GiveDiamondFragment : BaseViewBindingFragment<FragmentGiveDiamondBinding>(
.setLayoutManager(LinearLayoutManager(context))
.setPageSize(20)
.setEmptyView(
EmptyViewHelper.createEmptyView(
EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.me_give_gold_empty)
)

View File

@@ -46,7 +46,7 @@ class GiveGiftFragment : BaseViewBindingFragment<FragmentGiveGiftBinding>() {
.setLayoutManager(LinearLayoutManager(context))
.setPageSize(20)
.setEmptyView(
EmptyViewHelper.createEmptyView(
EmptyViewHelper.createEmptyTextView(
context,
ResUtil.getString(R.string.me_give_gold_empty)
)

View File

@@ -86,7 +86,7 @@ class CpInviteRecordActivity : BaseBindingActivity<ActivityCpInviteRecordBinding
}
val layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)
mBinding.recyclerView.layoutManager = layoutManager
adapter.emptyView = EmptyViewHelper.createEmptyView(this, ResUtil.getString(R.string.cp_activity_cpinviterecordactivity_02))
adapter.emptyView = EmptyViewHelper.createEmptyTextView(this, ResUtil.getString(R.string.cp_activity_cpinviterecordactivity_02))
adapter.bindToRecyclerView(mBinding.recyclerView)
mBinding.swipeRefresh.setOnRefreshListener {
queryRecord(type)

View File

@@ -80,7 +80,7 @@ class SkillHomeActivity : BaseBindingActivity<ActivitySkillHomeBinding>() {
adapter.setNewData(it)
if (it.isEmpty()) {
adapter.setHeaderAndEmpty(false)
adapter.emptyView = createEmptyView()
adapter.emptyView = createEmptyTextView()
}
dialogManager.dismissDialog()
},
@@ -89,15 +89,15 @@ class SkillHomeActivity : BaseBindingActivity<ActivitySkillHomeBinding>() {
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 =

View File

@@ -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<DrawInfo?>()
val drawInfoLiveData: MutableLiveData<DrawInfo?> = _drawInfoLiveData
private val _prizeInfoListLiveData = MutableLiveData<List<PrizeInfo>?>()
val prizeInfoListLiveData: MutableLiveData<List<PrizeInfo>?> = _prizeInfoListLiveData
private val _resultLiveData = MutableLiveData<Event<List<PrizeInfo>>?>()
val resultLiveData: MutableLiveData<Event<List<PrizeInfo>>?> = _resultLiveData
private val _showGetKeyLiveData = MutableLiveData<Event<Boolean>>()
val showGetKeyLiveData: LiveData<Event<Boolean>> = _showGetKeyLiveData
private val _drawForestLiveData = MutableLiveData<Event<List<PrizeInfo>>?>()
val drawForestLiveData: MutableLiveData<Event<List<PrizeInfo>>?> = _drawForestLiveData
private val _forestInfoLiveData = MutableLiveData<ForestInfo?>()
val forestInfoLiveData: MutableLiveData<ForestInfo?> = _forestInfoLiveData
private val _forestPoolLiveData = MutableLiveData<Pair<Int, List<PrizeInfo>?>?>()
val forestPoolLiveData: MutableLiveData<Pair<Int, List<PrizeInfo>?>?> = _forestPoolLiveData
private val _forestRecordLiveData = MutableLiveData<ListResult<PrizeInfo>>()
val forestRecordLiveData: LiveData<ListResult<PrizeInfo>> = _forestRecordLiveData
private val _myFairyInfoLiveData = MutableLiveData<MyFairyInfo?>()
val myFairyInfoLiveData: MutableLiveData<MyFairyInfo?> = _myFairyInfoLiveData
private val _friendsListLiveData = MutableLiveData<List<SimpleUserInfo>?>()
val friendsListLiveData: MutableLiveData<List<SimpleUserInfo>?> = _friendsListLiveData
private val _sendFairyLiveData = MutableLiveData<Event<Boolean>>()
val sendFairyLiveData: LiveData<Event<Boolean>> = _sendFairyLiveData
private val _sendFairyRecordLiveData = MutableLiveData<ListResult<SendFairyInfo>>()
val sendFairyRecordLiveData: LiveData<ListResult<SendFairyInfo>> = _sendFairyRecordLiveData
private val _compoundFairyInfosLiveData = MutableLiveData<SparseArray<FairyInfo>?>()
val compoundFairyInfosLiveData: MutableLiveData<SparseArray<FairyInfo>?> = _compoundFairyInfosLiveData
private val _testResultLiveData = MutableLiveData<Event<FairyInfo>?>()
val testResultLiveData: MutableLiveData<Event<FairyInfo>?> = _testResultLiveData
private val _testLegendResultLiveData = MutableLiveData<Event<FairyInfo>?>()
val testLegendResultLiveData: MutableLiveData<Event<FairyInfo>?> = _testLegendResultLiveData
private val _testRecordLiveData = MutableLiveData<ListResult<TestFairyRecordInfo>>()
val testRecordLiveData: LiveData<ListResult<TestFairyRecordInfo>> = _testRecordLiveData
private val _exchangeGiftListLiveData = MutableLiveData<List<ExchangeGiftInfo>?>()
val exchangeGiftListLiveData: MutableLiveData<List<ExchangeGiftInfo>?> = _exchangeGiftListLiveData
private val _exchangeGiftLiveData = MutableLiveData<Event<ExchangeGiftInfo>>()
val exchangeGiftLiveData: LiveData<Event<ExchangeGiftInfo>> = _exchangeGiftLiveData
private val _debrisExchangeListLiveData = MutableLiveData<List<ExchangeGiftInfo>?>()
val debrisExchangeListLiveData: MutableLiveData<List<ExchangeGiftInfo>?> = _debrisExchangeListLiveData
private val _debrisExchangeLiveData = MutableLiveData<Event<ExchangeGiftInfo>>()
val debrisExchangeLiveData: LiveData<Event<ExchangeGiftInfo>> = _debrisExchangeLiveData
private val _exchangeFairyRecordLiveData = MutableLiveData<ListResult<ExchangeGiftInfo>>()
val exchangeFairyRecordLiveData: LiveData<ListResult<ExchangeGiftInfo>> =
_exchangeFairyRecordLiveData
private val _exchangeDebrisRecordLiveData = MutableLiveData<ListResult<ExchangeGiftInfo>>()
val exchangeDebrisRecordLiveData: LiveData<ListResult<ExchangeGiftInfo>> =
_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<FairyInfo>) {
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<FairyInfo>): 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)
}
)
}
}

View File

@@ -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<TreasureFairyDialogHomeBinding>() {
private var selectIndex = 0
private var targetIndex: Int = -1
private val removeRunnable = Runnable { binding.llPrizeHint.removeAllViews() }
private val hintPrizeCacheList = ArrayList<PrizeInfo>()
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<View>(R.id.tv_prize_name) as TextView).text =
prizeInfo.rewardName
(linearLayout.findViewById<View>(R.id.tv_prize_num) as TextView).text =
"x" + prizeInfo.rewardNum
}
}

View File

@@ -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<ExchangeGiftInfo, BaseViewHolder>(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)
}
}

View File

@@ -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<ExchangeGiftInfo, BaseViewHolder>(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())
}
}

View File

@@ -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<ExchangeGiftInfo, BaseViewHolder>(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)
}
)
}
}

View File

@@ -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<ExchangeGiftInfo, BaseViewHolder>(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)
}
}

View File

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

View File

@@ -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<PrizeInfo, BaseViewHolder>(
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<ImageView>(R.id.iv_prize_icon).load(item.rewardPicUrl)
helper.setText(R.id.tv_prize_name, "${item.rewardName}x${item.rewardNum}")
}
}

View File

@@ -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<PrizeInfo, BaseViewHolder>(R.layout.treasure_fairy_item_forest_prizes_child) {
override fun convert(helper: BaseViewHolder, item: PrizeInfo) {
helper.getView<ImageView>(R.id.iv_prize_icon).load(item.rewardPicUrl)
helper.setText(R.id.tv_prize_name, item.rewardName)
}
}

View File

@@ -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<PrizeInfo, BaseViewHolder>(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)
}
)
}
}

View File

@@ -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<PrizeInfo, BaseViewHolder>(
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<ImageView>(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)
}
}

View File

@@ -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<SimpleUserInfo, BaseViewHolder>(R.layout.treasure_fairy_item_my_fairy_friend) {
override fun convert(helper: BaseViewHolder, item: SimpleUserInfo) {
helper.getView<ImageView>(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) })
}
}

View File

@@ -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<SendFairyInfo, BaseViewHolder>(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<ImageView>(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}”精靈卡"
)
}
}

View File

@@ -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<FairyInfo, BaseViewHolder>(R.layout.treasure_fairy_item_test_fairy) {
override fun convert(helper: BaseViewHolder, item: FairyInfo) {
helper.getView<ImageView>(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
)
}
}

View File

@@ -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<TestFairyRecordInfo, BaseViewHolder>(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}" })
}
}

View File

@@ -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<FairyInfo, BaseViewHolder>(R.layout.treasure_fairy_item_forest_prize_single) {
override fun convert(helper: BaseViewHolder, item: FairyInfo) {
helper.getView<ImageView>(R.id.iv_prize_icon).load(item.elfPicUrl)
helper.setText(R.id.tv_prize_name, item.elfName)
}
}

View File

@@ -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<TreasureFairyDialogExchangeBinding>() {
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()
}
}

View File

@@ -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<TreasureFairyDialogTestFairyResultBinding>() {
private lateinit var rvDelegate: RVDelegate<ExchangeGiftInfo>
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<ExchangeGiftInfo>()
.setAdapter(prizeAdapter)
.setRecyclerView(binding.recyclerView)
.setLayoutManager(
LinearLayoutManager(context)
)
.build()
rvDelegate.setNewData(arrayListOf(prizeInfoList.peekContent()))
}
}

View File

@@ -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<TreasureFairyDialogExchangeRecordBinding>() {
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()
)
)
}
}

View File

@@ -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<TreasureFairyDialogForestBinding>() {
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)
}
}
}
}

View File

@@ -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<TreasureFairyDialogForestPrizeBinding>() {
private lateinit var rvDelegate: RVDelegate<PrizeInfo>
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<PrizeInfo>()
.setAdapter(prizeAdapter)
.setRecyclerView(binding.recyclerView)
.setLayoutManager(
if (isShowDateSingle) {
LinearLayoutManager(context)
} else {
GridLayoutManager(context, 3, LinearLayoutManager.VERTICAL, false)
}
)
.build()
rvDelegate.setNewData(showPrizeInfoList)
}
}

View File

@@ -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<TreasureFairyDialogForestRecordBinding>() {
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(),
)
)
}
}

View File

@@ -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<View>(R.id.tv_rule).setOnClickListener {
FairyDialogWebViewActivity.start(context, UriProvider.getFairyRule())
dismiss()
}
findViewById<View>(R.id.tv_record).setOnClickListener {
FairyDialogWebViewActivity.start(context, UriProvider.getFairyRecord())
dismiss()
}
findViewById<View>(R.id.tv_rank).setOnClickListener {
FairyDialogWebViewActivity.start(context, UriProvider.getFairySuperior())
dismiss()
}
}
fun show(anchor: View?, popupGravity: Int) {
setPopupGravity(popupGravity)
showPopupWindow(anchor)
}
}

View File

@@ -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<TreasureFairyDialogHomePrizeBinding>() {
override var width = WindowManager.LayoutParams.MATCH_PARENT
override var gravity = Gravity.BOTTOM
private lateinit var rvDelegate: RVDelegate<PrizeInfo>
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<PrizeInfo>()
.setAdapter(prizeAdapter)
.setRecyclerView(binding.recyclerView)
.setLayoutManager(
if (isSingle) {
LinearLayoutManager(context)
} else {
GridLayoutManager(context, 4, LinearLayoutManager.VERTICAL, false)
}
)
.build()
rvDelegate.setNewData(prizeInfoList)
}
}

View File

@@ -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<TreasureFairyDialogMyFairyBinding>() {
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()
}
}

View File

@@ -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<TreasureFairyDialogMyFairyRecordBinding>() {
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<SendFairyInfo>
private lateinit var recordAdapter: MyFairyRecordAdapter
private val viewModel: FairyViewModel by activityViewModels()
@SuppressLint("CheckResult")
override fun init() {
recordAdapter = MyFairyRecordAdapter()
rvDelegate = RVDelegate.Builder<SendFairyInfo>()
.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)
}
}

View File

@@ -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<TreasureFairyDialogMyFairySearchFriendBinding>() {
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<SimpleUserInfo>
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<SimpleUserInfo>()
.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())
}
}
}

View File

@@ -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<TreasureFairyDialogMyFairySendBinding>() {
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
}
}

View File

@@ -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<TreasureFairyDialogTestFairyBinding>() {
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()
}
}

View File

@@ -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<TreasureFairyDialogTestFairyRecordBinding>() {
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<TestFairyRecordInfo>
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<TestFairyRecordInfo>()
.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)
}
}

View File

@@ -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<TreasureFairyDialogTestFairyResultBinding>() {
private lateinit var rvDelegate: RVDelegate<FairyInfo>
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<FairyInfo>()
.setAdapter(prizeAdapter)
.setRecyclerView(binding.recyclerView)
.setLayoutManager(
LinearLayoutManager(context)
)
.build()
rvDelegate.setNewData(arrayListOf(fairyInfo))
viewModel.cleanTestParam()
}
}

View File

@@ -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<TreasureFairyFragmentExchangeDebrisBinding>() {
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<ExchangeGiftInfo>
private lateinit var debrisAdapter: ExchangeDebrisAdapter
@SuppressLint("CheckResult")
override fun init() {
debrisAdapter = ExchangeDebrisAdapter()
rvDelegate = RVDelegate.Builder<ExchangeGiftInfo>()
.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()
}
}
}
}

View File

@@ -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<TreasureFairyFragmentExchangeRecordDebrisBinding>() {
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<ExchangeGiftInfo>
private lateinit var prizeAdapter: ExchangeDebrisRecordAdapter
private val viewModel: FairyViewModel by activityViewModels()
@SuppressLint("CheckResult")
override fun init() {
prizeAdapter = ExchangeDebrisRecordAdapter()
rvDelegate = RVDelegate.Builder<ExchangeGiftInfo>()
.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)
}
}

View File

@@ -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<TreasureFairyFragmentExchangeFairyBinding>() {
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<ExchangeGiftInfo>) {
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
}
}

View File

@@ -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<TreasureFairyFragmentExchangeRecordFairyBinding>() {
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<ExchangeGiftInfo>
private lateinit var prizeAdapter: ExchangeFairyRecordAdapter
private val viewModel: FairyViewModel by activityViewModels()
@SuppressLint("CheckResult")
override fun init() {
prizeAdapter = ExchangeFairyRecordAdapter()
rvDelegate = RVDelegate.Builder<ExchangeGiftInfo>()
.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)
}
}

View File

@@ -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<TreasureFairyFragmentForestPrizesChildBinding>() {
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<PrizeInfo>
private lateinit var prizeAdapter: ForestPrizesChildAdapter
private val viewModel: FairyViewModel by activityViewModels()
@SuppressLint("CheckResult")
override fun init() {
prizeAdapter = ForestPrizesChildAdapter()
rvDelegate = RVDelegate.Builder<PrizeInfo>()
.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)
}
}
}
}

View File

@@ -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<TreasureFairyFragmentForestPrizesBinding>() {
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<Fragment> = ArrayList()
fragmentList.add(ForestPrizesChildFragment.newInstance(1))
fragmentList.add(ForestPrizesChildFragment.newInstance(2))
fragmentList.add(ForestPrizesChildFragment.newInstance(3))
val pagerAdapter = UserInfoPagerAdapter(childFragmentManager, fragmentList)
val tagList: MutableList<String> = 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)
}
}

View File

@@ -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<TreasureFairyFragmentForestRecordBinding>() {
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<PrizeInfo>
private lateinit var prizeAdapter: ForestPrizesRecordAdapter
private val viewModel: FairyViewModel by activityViewModels()
@SuppressLint("CheckResult")
override fun init() {
prizeAdapter = ForestPrizesRecordAdapter()
rvDelegate = RVDelegate.Builder<PrizeInfo>()
.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)
}
}

View File

@@ -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<TreasureFairyFragmentMyFairyBinding>() {
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))
}
}
}
}
}
}

View File

@@ -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<TreasureFairyFragmentTestFairyBinding>() {
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<FairyInfo>
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<FairyInfo>()
.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()
}
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -45,7 +45,7 @@ class GrantedPermissionsActivity : BaseActivity() {
rvDelegate = RVDelegate.Builder<PermissionEntity>()
.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()
}

View File

@@ -46,7 +46,7 @@ class ShieldManageActivity : BaseViewBindingActivity<ActivityShieldManageBinding
.setLayoutManager(LinearLayoutManager(this))
.setPageSize(pageSize)
.setEmptyView(
EmptyViewHelper.createEmptyView(
EmptyViewHelper.createEmptyTextView(
this,
getString(R.string.your_shield_list_is_empty)
)

View File

@@ -109,7 +109,7 @@ public class RVDelegate<T> {
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);
}

View File

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

View File

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

View File

@@ -98,7 +98,7 @@ class VipMainActivity : BaseViewBindingActivity<ActivityVipMainBinding>(),
.setLayoutManager(GridLayoutManager(this, 3))
.setRecyclerView(binding.recyclerView)
.setEmptyView(
EmptyViewHelper.createEmptyView(
EmptyViewHelper.createEmptyTextView(
context,
getString(R.string.me_no_search_results)
)

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Some files were not shown because too many files have changed in this diff Show More