From 9ddc66b4ae4d9fbe1529219d7032ba43e5687f07 Mon Sep 17 00:00:00 2001 From: huangjian Date: Fri, 17 Feb 2023 18:10:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=BA=E5=AE=9D=E7=B2=BE=E7=81=B5:=E4=B8=BB?= =?UTF-8?q?=E9=A1=B5=E6=8E=A5=E5=8F=A3=E5=AF=B9=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../moshen/treasurefairy/FairyViewModel.kt | 74 +++++++++ .../mango/moshen/treasurefairy/HomeDialog.kt | 146 ++++++++++++++---- .../moshen/treasurefairy/HomeItemView.kt | 8 +- .../moshen/treasurefairy/HomePrizeAdapter.kt | 10 +- .../moshen/treasurefairy/HomePrizeDialog.kt | 18 ++- .../res/layout/treasure_fairy_dialog_home.xml | 10 ++ .../treasure_fairy_dialog_home_prize.xml | 9 +- .../layout/treasure_fairy_item_home_prize.xml | 5 +- .../java/com/mango/core/UriProvider.java | 7 + .../com/mango/core/treasurefairy/DrawInfo.kt | 7 + .../com/mango/core/treasurefairy/PrizeInfo.kt | 28 ++++ .../core/treasurefairy/TreasureFairyModel.kt | 50 ++++++ 12 files changed, 326 insertions(+), 46 deletions(-) create mode 100644 app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt create mode 100644 core/src/main/java/com/mango/core/treasurefairy/DrawInfo.kt create mode 100644 core/src/main/java/com/mango/core/treasurefairy/PrizeInfo.kt create mode 100644 core/src/main/java/com/mango/core/treasurefairy/TreasureFairyModel.kt diff --git a/app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt b/app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt new file mode 100644 index 000000000..f8070f4f2 --- /dev/null +++ b/app/src/main/java/com/mango/moshen/treasurefairy/FairyViewModel.kt @@ -0,0 +1,74 @@ +package com.mango.moshen.treasurefairy + +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData +import com.mango.moshen.base.BaseViewModel +import com.mango.core.bean.response.ListResult +import com.mango.core.home.bean.HomeRoomInfo +import com.mango.core.home.model.HomeModel +import com.mango.core.treasurefairy.DrawInfo +import com.mango.core.treasurefairy.PrizeInfo +import com.mango.core.treasurefairy.TreasureFairyModel +import com.mango.core.utils.net.ServerException +import com.mango.core.utils.toast +import com.mango.moshen.base.Event + +class FairyViewModel : BaseViewModel() { + + private val _drawInfoLiveData = MutableLiveData() + val drawInfoLiveData: LiveData = _drawInfoLiveData + + private val _prizeInfoListLiveData = MutableLiveData>() + val prizeInfoListLiveData: LiveData> = _prizeInfoListLiveData + + private val _resultLiveData = MutableLiveData>>() + val resultLiveData: LiveData>> = _resultLiveData + + private val _showGetKeyLiveData = MutableLiveData>() + val showGetKeyLiveData: LiveData> = _showGetKeyLiveData + + init { + initPrizeInfoList() + } + + + fun initDrawInfo() { + safeLaunch( + onError = { + _drawInfoLiveData.value = null + }, + block = { + _drawInfoLiveData.value = TreasureFairyModel.getDrawInfo() + } + ) + } + + private 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() + } + ) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/mango/moshen/treasurefairy/HomeDialog.kt b/app/src/main/java/com/mango/moshen/treasurefairy/HomeDialog.kt index fbc7fc23e..3658a6992 100644 --- a/app/src/main/java/com/mango/moshen/treasurefairy/HomeDialog.kt +++ b/app/src/main/java/com/mango/moshen/treasurefairy/HomeDialog.kt @@ -6,63 +6,145 @@ import android.graphics.Path import android.view.* import android.widget.LinearLayout import android.widget.TextView +import androidx.fragment.app.activityViewModels +import com.mango.core.UriProvider +import com.mango.core.treasurefairy.PrizeInfo import com.mango.moshen.R import com.mango.moshen.base.BaseDialog +import com.mango.moshen.common.widget.dialog.DialogManager import com.mango.moshen.databinding.TreasureFairyDialogHomeBinding -import com.mango.treasure_box.bean.PrizeInfo +import com.mango.moshen.ui.webview.ElfDialogWebViewActivity import com.netease.nim.uikit.common.util.sys.ScreenUtil import io.reactivex.Observable import io.reactivex.android.schedulers.AndroidSchedulers +import io.reactivex.disposables.Disposable import java.util.concurrent.TimeUnit class HomeDialog : BaseDialog() { private var selectIndex = 0 + private var targetIndex: Int = -1 private val removeRunnable = Runnable { binding.llPrizeHint.removeAllViews() } private val hintPrizeCacheList = ArrayList() override var width = WindowManager.LayoutParams.MATCH_PARENT override var gravity = Gravity.BOTTOM - override fun init() { - val views = listOf( + private var disposable: Disposable? = null + private val viewModel: FairyViewModel by activityViewModels() + + 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 ) + } - Observable.interval(100, TimeUnit.MILLISECONDS) - .observeOn(AndroidSchedulers.mainThread()) - .compose(bindToLifecycle()) - .doOnNext { - views[selectIndex].isSelected = false - selectIndex++ - if (selectIndex == views.size) selectIndex = 0 - views[selectIndex].isSelected = true - } - .subscribe() - binding.ivLuckyStone.post { - val drawable = CustomDrawable(binding.ivLuckyStone.drawable) - val path = Path() - path.addRect( - 0f, - 0f, - binding.ivLuckyStone.width.toFloat(), - binding.ivLuckyStone.height.toFloat() / 2, - Path.Direction.CW - ) - drawable.setSrcPath(path) - binding.ivLuckyStone.setImageDrawable(drawable) + @SuppressLint("SetTextI18n") + override fun init() { + looperHintPrize() + binding.tvKeyNum.setOnClickListener { + ElfDialogWebViewActivity.start(context, UriProvider.getFairyKey()) } - - binding.ivOpen1.setOnClickListener { - HomePrizeDialog.newInstance().show(context) - } - binding.ivMyFairy.setOnClickListener { MyFairyDialog.newInstance().show(context) } + binding.ivOpen1.setOnClickListener { + rotatePrize() + viewModel.drawFairy(1) + } + binding.ivOpen10.setOnClickListener { + rotatePrize() + viewModel.drawFairy(10) + } + binding.ivOpen100.setOnClickListener { + rotatePrize() + viewModel.drawFairy(100) + } + 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.resultLiveData.observe(viewLifecycleOwner) { event -> + event?.getContentIfNotHandled()?.let { + targetIndex = viewModel.prizeInfoListLiveData.value?.indexOf(it[0]) ?: -1 + hintPrizeCacheList.addAll(it.filter { prizeInfo -> prizeInfo.rewardLevel >= 3 }) + } ?: run { + targetIndex = -1 + disposable?.dispose() + } + } + + viewModel.prizeInfoListLiveData.observe(viewLifecycleOwner) { + it?.forEachIndexed { index, prizeInfo -> + fairyItems[index].setPrizeInfo(prizeInfo) + } + } + + viewModel.drawInfoLiveData.observe(viewLifecycleOwner) { + it?.let { + binding.tvKeyNum.text = it.drawTicketNum.toString() + binding.tvCurrentLuckyValue.text = it.luckyNum.toString() + binding.tvShortLuckyValue.text = "达到${it.needLuckyNum}后下次夺宝,额外获赠精灵球" + binding.ivLuckyStone.post { + val drawable = CustomDrawable(binding.ivLuckyStone.drawable) + 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(viewLifecycleOwner) { + it.getContentIfNotHandled()?.let { + DialogManager(context).showOkCancelDialog("购买限时装扮活动夺宝券", "去参与", "取消") { + ElfDialogWebViewActivity.start(context, UriProvider.getFairyKey()) + } + } + } + } + + override fun onResume() { + super.onResume() + viewModel.initDrawInfo() + } + + private fun rotatePrize() { + 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 + fairyItems[selectIndex].isSelected = true + if (selectIndex == targetIndex && minCount >= 24) { + HomePrizeDialog.newInstance().show(context) + disposable?.dispose() + } + } + .subscribe() } @SuppressLint("CheckResult") @@ -104,9 +186,9 @@ class HomeDialog : BaseDialog() { .start() } (linearLayout.findViewById(R.id.tv_prize_name) as TextView).text = - prizeInfo.prizeName + prizeInfo.rewardName (linearLayout.findViewById(R.id.tv_prize_num) as TextView).text = - "x" + prizeInfo.prizeNum + "x" + prizeInfo.rewardNum } } \ No newline at end of file diff --git a/app/src/main/java/com/mango/moshen/treasurefairy/HomeItemView.kt b/app/src/main/java/com/mango/moshen/treasurefairy/HomeItemView.kt index 987e3be36..b17839a63 100644 --- a/app/src/main/java/com/mango/moshen/treasurefairy/HomeItemView.kt +++ b/app/src/main/java/com/mango/moshen/treasurefairy/HomeItemView.kt @@ -4,8 +4,10 @@ import android.content.Context import android.util.AttributeSet import android.widget.LinearLayout import androidx.annotation.Nullable +import com.mango.core.treasurefairy.PrizeInfo import com.mango.moshen.R import com.mango.moshen.databinding.TreasureFairyItemHomeBinding +import com.mango.moshen.ui.utils.load /** * 技能卡 @@ -18,10 +20,14 @@ class HomeItemView @JvmOverloads constructor( private val binding: TreasureFairyItemHomeBinding - init { inflate(context, R.layout.treasure_fairy_item_home, this) binding = TreasureFairyItemHomeBinding.bind(this) } + fun setPrizeInfo(prizeInfo: PrizeInfo) { + binding.ivPrizeIcon.load(prizeInfo.rewardPicUrl) + binding.tvPrizeName.text = prizeInfo.rewardName + } + } \ No newline at end of file diff --git a/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeAdapter.kt b/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeAdapter.kt index c7323363f..1ecf96069 100644 --- a/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeAdapter.kt +++ b/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeAdapter.kt @@ -6,13 +6,15 @@ import com.chad.library.adapter.base.BaseViewHolder import com.mango.moshen.R import com.mango.moshen.ui.utils.load import com.mango.core.room.game.GameInfo +import com.mango.core.treasurefairy.PrizeInfo class HomePrizeAdapter : - BaseQuickAdapter(R.layout.treasure_fairy_item_home_prize) { + BaseQuickAdapter(R.layout.treasure_fairy_item_home_prize) { - override fun convert(helper: BaseViewHolder, item: GameInfo) { - helper.getView(R.id.iv_cover).load(item.pic,12f) - helper.itemView.isSelected = item.isSelect + override fun convert(helper: BaseViewHolder, item: PrizeInfo) { + helper.getView(R.id.iv_prize_icon).load(item.rewardPicUrl) + helper.setText(R.id.tv_prize_num, "x${item.rewardNum}") + helper.setText(R.id.tv_prize_name, item.rewardName) } } \ No newline at end of file diff --git a/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeDialog.kt b/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeDialog.kt index 0cc4a96d8..1d602aeff 100644 --- a/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeDialog.kt +++ b/app/src/main/java/com/mango/moshen/treasurefairy/HomePrizeDialog.kt @@ -4,22 +4,26 @@ 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.mango.core.room.game.GameInfo +import com.mango.core.treasurefairy.PrizeInfo import com.mango.moshen.base.BaseDialog import com.mango.moshen.databinding.TreasureFairyDialogHomePrizeBinding import com.mango.moshen.ui.utils.RVDelegate class HomePrizeDialog : BaseDialog() { - private lateinit var rvDelegate: RVDelegate + private lateinit var rvDelegate: RVDelegate private val prizeAdapter = HomePrizeAdapter() override var width = WindowManager.LayoutParams.MATCH_PARENT override var gravity = Gravity.BOTTOM + private val viewModel: FairyViewModel by activityViewModels() - companion object{ - fun newInstance(): HomePrizeDialog{ + companion object { + fun newInstance(): HomePrizeDialog { val args = Bundle() val fragment = HomePrizeDialog() fragment.arguments = args @@ -33,11 +37,15 @@ class HomePrizeDialog : BaseDialog() { dismissAllowingStateLoss() } - rvDelegate = RVDelegate.Builder() + rvDelegate = RVDelegate.Builder() .setAdapter(prizeAdapter) .setRecyclerView(binding.recyclerView) - .setLayoutManager(LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)) + .setLayoutManager(GridLayoutManager(context,4, LinearLayoutManager.VERTICAL, false)) .build() + + viewModel.resultLiveData.observe(viewLifecycleOwner) { event -> + rvDelegate.setNewData(event.peekContent()) + } } } \ No newline at end of file diff --git a/app/src/main/res/layout/treasure_fairy_dialog_home.xml b/app/src/main/res/layout/treasure_fairy_dialog_home.xml index 91916663f..be2984e6c 100644 --- a/app/src/main/res/layout/treasure_fairy_dialog_home.xml +++ b/app/src/main/res/layout/treasure_fairy_dialog_home.xml @@ -34,6 +34,7 @@ android:background="@drawable/treasure_fairy_bg_key_number" android:gravity="center" android:paddingStart="8dp" + android:layout_marginStart="15dp" android:paddingTop="2dp" android:text="12.2W" android:textColor="@color/white" @@ -244,6 +245,15 @@ app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" /> + + - ? = launchRequest { + api.drawTreasureFairy(drawNum, AvRoomDataManager.get().roomUid) + } + + suspend fun getDrawInfo(): DrawInfo? = launchRequest { + api.getDrawInfo() + } + + suspend fun getPrizeInfoList(): List? = launchRequest { + api.getPrizeInfoList() + } + + private interface Api { + + /** + * + * + * @param drawNum + * @return + */ + @FormUrlEncoded + @POST("act/seize-treasure/draw") + suspend fun drawTreasureFairy( + @Field("drawNum") drawNum: Int, + @Field("roomUid") roomUid: Long + ): ServiceResult> + + @GET("act/seize-treasure/user/draw/info") + suspend fun getDrawInfo(): ServiceResult + + @GET("act/seize-treasure/draw/pool/list") + suspend fun getPrizeInfoList(): ServiceResult> + } + +} \ No newline at end of file