普通签到逻辑

This commit is contained in:
renhaoting 2025-11-26 15:31:34 +08:00
parent 2ef5e5deab
commit 4843f71574
9 changed files with 243 additions and 51 deletions

View File

@ -10,13 +10,15 @@ import com.gamedog.vididin.widget.DailySignItemView
class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(context, DialogDailySignBinding::inflate) { class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(context, DialogDailySignBinding::inflate) {
private var mCurDayIndex: Int = 0 private var mCurDayIndex: Int = 0
private var mDataList: List<RewardDetail>? = emptyList() private var mSelectedDayIndex: Int = 0
private var mSignItemList: MutableList<DailySignItemView> = mutableListOf() private var mRewardDetailList: List<RewardDetail>? = emptyList()
private var mSignItemViewList: MutableList<DailySignItemView> = mutableListOf()
private var mSignStateList: MutableList<DailySignItemView> = mutableListOf()
init { init {
build() build()
mDataList = TaskManager.instance().getDailyCheckInTask()?.reward_details mRewardDetailList = TaskManager.instance().getDailyCheckInTask()?.reward_details
initSignItemViews() initSignItemViews()
initSignState() initSignState()
} }
@ -30,13 +32,16 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
mBinding.run { mBinding.run {
setOnClickBatch(butLeft, butRight, ivClose) { setOnClickBatch(butSign, butWatchAd, ivClose) {
when (this) { when (this) {
butLeft, ivClose -> { ivClose -> {
dismiss() dismiss()
} }
butRight -> { butSign -> {
handleRightButClicked() handleNormalSignClicked()
}
butWatchAd -> {
gotoWatchAdPage()
dismiss() dismiss()
} }
} }
@ -44,22 +49,29 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
} }
} }
private fun handleNormalSignClicked() {
val rewardConfig = mRewardDetailList?.get(mSelectedDayIndex)
if (TaskManager.instance().executeDailySign(mSelectedDayIndex, rewardConfig?.value ?: 0)) {
DailySignSuccessDialog(context).setRewardNum(mRewardDetailList?.get(mCurDayIndex)?.value).show()
}
}
private fun initSignItemViews() { private fun initSignItemViews() {
with(mBinding) { with(mBinding) {
signItem7.setLargeWidthMode() signItem7.setLargeWidthMode()
mSignItemList.add(signItem1) mSignItemViewList.add(signItem1)
mSignItemList.add(signItem2) mSignItemViewList.add(signItem2)
mSignItemList.add(signItem3) mSignItemViewList.add(signItem3)
mSignItemList.add(signItem4) mSignItemViewList.add(signItem4)
mSignItemList.add(signItem5) mSignItemViewList.add(signItem5)
mSignItemList.add(signItem6) mSignItemViewList.add(signItem6)
mSignItemList.add(signItem7) mSignItemViewList.add(signItem7)
mDataList?.let { mRewardDetailList?.let {
mSignItemList.forEachIndexed { index, itemView-> mSignItemViewList.forEachIndexed { index, itemView->
itemView.setData(mDataList!![index], { isSelected -> itemView.setData(mRewardDetailList!![index], { isSelected ->
handleItemSelectStateChanged(index, isSelected) handleItemSelectStateChanged(index, isSelected)
}) })
} }
@ -69,11 +81,13 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
private fun initSignState() { private fun initSignState() {
mCurDayIndex = TaskManager.instance().getCurDayIndexOfDailyCheckIn() mCurDayIndex = TaskManager.instance().getCurDayIndexOfDailyCheckIn()
mSignItemList[mCurDayIndex].setSelectState(true) mSelectedDayIndex = mCurDayIndex
mSignItemViewList[mCurDayIndex].setSelectState(true)
} }
private fun handleItemSelectStateChanged(itemIndex: Int, selected: Boolean) { private fun handleItemSelectStateChanged(itemIndex: Int, selected: Boolean) {
mSignItemList.forEachIndexed { index, itemView -> mSelectedDayIndex = itemIndex
mSignItemViewList.forEachIndexed { index, itemView ->
if (itemIndex != index) { if (itemIndex != index) {
itemView.setSelectState(false) itemView.setSelectState(false)
} }
@ -81,7 +95,7 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
} }
private fun handleRightButClicked() { private fun gotoWatchAdPage() {
} }

View File

@ -0,0 +1,49 @@
package com.gamedog.vididin.main.fragments.task
import android.content.Context
import com.ama.core.architecture.util.setOnClickBatch
import com.ama.core.architecture.widget.BindingDialog
import com.gamedog.vididin.databinding.DialogDailySignSuccessBinding as ViewBinding
class DailySignSuccessDialog(context: Context) : BindingDialog<ViewBinding>(context, ViewBinding::inflate) {
init {
build()
}
private fun build() {
with()
setCenter()
setCanCancel(false)
setMaskValue(0.9f)
setWidthRatio(0.93)
mBinding.run {
setOnClickBatch(flAction, ivClose) {
when (this) {
ivClose -> {
dismiss()
}
flAction -> {
dismiss()
gotoWatchAdPage()
}
}
}
}
}
private fun gotoWatchAdPage() {
//TODO("Not yet implemented")
}
fun setRewardNum(goldNum: Int?) : DailySignSuccessDialog {
mBinding.tvGoldNum.text = "+$goldNum"
return this
}
}

View File

@ -41,12 +41,13 @@ class TaskManager private constructor() {
} }
private var mCurDayIndexDailySign: Int = 0
private val mutex = Mutex() private val mutex = Mutex()
@Volatile @Volatile
private var initialized = false private var initialized = false
private var mTaskConfig: TaskBean? = null private var mTaskConfig: TaskBean? = null
private var mTaskBean: TaskStateBean = TaskStateBean(DailySignBean()) private var mDailySignData: DailySignBean = DailySignBean()
private val mGson = GsonBuilder().create() private val mGson = GsonBuilder().create()
@ -67,7 +68,7 @@ class TaskManager private constructor() {
mutex.withLock { mutex.withLock {
if (!initialized) { if (!initialized) {
loadTaskConfigFromAsset() loadTaskConfigFromAsset()
loadTaskStateFromSp() loadTaskStatesFromSp()
} }
} }
} }
@ -82,13 +83,13 @@ class TaskManager private constructor() {
} }
private suspend fun loadTaskStateFromSp() { private suspend fun loadTaskStatesFromSp() {
return withContext(Dispatchers.IO) { return withContext(Dispatchers.IO) {
val taskStateBeanInSp = SpUtil.instance().getObject<TaskStateBean>(SpUtil.KEY_TASK_BEAN) val taskStateBeanInSp = SpUtil.instance().getObject<DailySignBean>(SpUtil.KEY_TASK_BEAN)
if (taskStateBeanInSp == null) { if (taskStateBeanInSp == null) {
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean) SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
} else { } else {
mTaskBean = taskStateBeanInSp mDailySignData = taskStateBeanInSp
} }
} }
} }
@ -138,22 +139,39 @@ class TaskManager private constructor() {
fun getCurDayIndexOfDailyCheckIn() : Int { fun getCurDayIndexOfDailyCheckIn() : Int {
val periodStartMs = mTaskBean.dailySignBean.startMs var dayIndexOfPeriod = 0
val periodStartMs = mDailySignData.startMs
if (periodStartMs > 0) { if (periodStartMs > 0) {
val dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs()) dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
if (dayIndexOfPeriod > 6) { if (dayIndexOfPeriod > 6) {
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs() mDailySignData.startMs = DateUtil.getCurTimeMs()
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean) SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
} }
return dayIndexOfPeriod
} else { } else {
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs() mDailySignData.startMs = DateUtil.getCurTimeMs()
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean) SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
return 0
}
} }
mCurDayIndexDailySign = dayIndexOfPeriod
return dayIndexOfPeriod
}
fun executeDailySign(dayIndex: Int, rewardNum: Int) : Boolean {
val daySignState = mDailySignData.signStateList[dayIndex]
if ((dayIndex == mCurDayIndexDailySign && daySignState.signState == DailySignBean.SIGN_STATE_ENABLE)
|| (daySignState.isComplementEnable)) {
daySignState.signState = DailySignBean.SIGN_STATE_DONE
daySignState.rewardNum += rewardNum
saveDailySignInfo()
return true
}
return false
}
private fun saveDailySignInfo() {
SpUtil.instance().putObject(SpUtil.KEY_DAILY_SIGN, mDailySignData)
}
} }

View File

@ -1,32 +1,40 @@
package com.gamedog.vididin.manager package com.gamedog.vididin.manager
import com.ama.core.architecture.util.DateUtil import com.gamedog.vididin.manager.DailySignBean.Companion.SIGN_STATE_DISABLE
import java.io.Serializable import java.io.Serializable
data class TaskStateBean(
val dailySignBean: DailySignBean
): Serializable
data class DailySignBean( data class DailySignBean(
var startMs: Long = 0, var startMs: Long = 0,
val signStateList: MutableList<Int> = mutableListOf() val signStateList: MutableList<DailySignDayInfoBean> = mutableListOf()
): Serializable { ): Serializable {
companion object{ companion object{
const val SIGN_STATE_ENABLE = 1 const val SIGN_STATE_ENABLE = 1
const val SIGN_STATE_WAIT = 2 const val SIGN_STATE_DISABLE = 2
const val SIGN_STATE_FORGOT = 3 const val SIGN_STATE_DONE = 3
const val SIGN_STATE_FORGOT = 4
} }
init { init {
signStateList.add(SIGN_STATE_ENABLE) signStateList.add(DailySignDayInfoBean(signState = SIGN_STATE_ENABLE))
signStateList.add(SIGN_STATE_WAIT) signStateList.add(DailySignDayInfoBean())
signStateList.add(SIGN_STATE_WAIT) signStateList.add(DailySignDayInfoBean())
signStateList.add(SIGN_STATE_WAIT) signStateList.add(DailySignDayInfoBean())
signStateList.add(SIGN_STATE_WAIT) signStateList.add(DailySignDayInfoBean())
signStateList.add(SIGN_STATE_WAIT) signStateList.add(DailySignDayInfoBean())
signStateList.add(SIGN_STATE_WAIT) signStateList.add(DailySignDayInfoBean())
} }
} }
data class DailySignDayInfoBean(
var signState: Int = SIGN_STATE_DISABLE,
var rewardNum: Int = 0,
var finishExtraAd: Boolean = false,
var isComplementEnable: Boolean = false, // 补签
): Serializable

View File

@ -27,7 +27,7 @@ class DailySignItemView @JvmOverloads constructor(
init { init {
mBinding = DailySignItemBinding.inflate(LayoutInflater.from(context), this, true) mBinding = DailySignItemBinding.inflate(LayoutInflater.from(context), this, true)
mBinding.run { mBinding.run {
setOnClickBatch(contentRoot) { setOnClickBatch(contentRoot, ) {
when(this) { when(this) {
contentRoot -> { contentRoot -> {
if (!mIsSelected) { if (!mIsSelected) {

View File

@ -151,7 +151,7 @@
android:orientation="horizontal"> android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:id="@+id/but_left" android:id="@+id/but_sign"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="42dp" android:layout_height="42dp"
android:layout_weight="1" android:layout_weight="1"
@ -164,7 +164,7 @@
<FrameLayout <FrameLayout
android:id="@+id/but_right" android:id="@+id/but_watch_ad"
android:layout_width="0dp" android:layout_width="0dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginStart="10dp" android:layout_marginStart="10dp"

View File

@ -0,0 +1,101 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="vertical">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:src="@mipmap/temp"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:textSize="16sp"
android:textColor="@color/white"
android:text="@string/sign_success_desc"
/>
<FrameLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/watch_video_gold_effect"/>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_gold_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginTop="20dp"
android:textSize="40sp"
android:textColor="@color/yellow_00"
android:text="+100"
/>
</FrameLayout>
<FrameLayout
android:id="@+id/fl_action"
android:layout_width="300dp"
android:layout_height="54dp"
android:layout_marginTop="24dp"
android:paddingHorizontal="20dp"
android:background="@mipmap/icon_action_but_bg">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_gravity="center"
android:gravity="center_vertical">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="18sp"
android:textColor="@color/white"
android:text="@string/assistir"
android:drawableLeft="@mipmap/task_video"
android:drawablePadding="5dp"
/>
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:layout_marginLeft="15dp"
android:textSize="21sp"
android:textColor="@color/yellow_00"
android:text="+100"
android:drawableStart="@mipmap/task_gold"
android:drawablePadding="5dp"
/>
</LinearLayout>
</FrameLayout>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/iv_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="64dp"
android:src="@mipmap/icon_close"/>
</LinearLayout>

View File

@ -63,6 +63,7 @@
<string name="privacy">Privacy</string> <string name="privacy">Privacy</string>
<string name="version">Version\n</string> <string name="version">Version\n</string>
<string name="title_cash_record">Dinheiro</string> <string name="title_cash_record">Dinheiro</string>
<string name="sign_success_desc">Você ganhou uma recompensa!</string>
</resources> </resources>

View File

@ -15,6 +15,7 @@ class SpUtil private constructor(spFileName: String) {
const val KEY_ACCOUNT = "KEY_ACCOUNT" const val KEY_ACCOUNT = "KEY_ACCOUNT"
const val KEY_ACCOUNT_TOKEN = "KEY_ACCOUNT_TOKEN" const val KEY_ACCOUNT_TOKEN = "KEY_ACCOUNT_TOKEN"
const val KEY_TASK_BEAN = "KEY_TASK_BEAN" const val KEY_TASK_BEAN = "KEY_TASK_BEAN"
const val KEY_DAILY_SIGN = "KEY_DAILY_SIGN"
private const val DEFAULT_SP_NAME = "enhanced_prefs" private const val DEFAULT_SP_NAME = "enhanced_prefs"
@Volatile @Volatile