普通签到逻辑

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) {
private var mCurDayIndex: Int = 0
private var mDataList: List<RewardDetail>? = emptyList()
private var mSignItemList: MutableList<DailySignItemView> = mutableListOf()
private var mSelectedDayIndex: Int = 0
private var mRewardDetailList: List<RewardDetail>? = emptyList()
private var mSignItemViewList: MutableList<DailySignItemView> = mutableListOf()
private var mSignStateList: MutableList<DailySignItemView> = mutableListOf()
init {
build()
mDataList = TaskManager.instance().getDailyCheckInTask()?.reward_details
mRewardDetailList = TaskManager.instance().getDailyCheckInTask()?.reward_details
initSignItemViews()
initSignState()
}
@ -30,13 +32,16 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
mBinding.run {
setOnClickBatch(butLeft, butRight, ivClose) {
setOnClickBatch(butSign, butWatchAd, ivClose) {
when (this) {
butLeft, ivClose -> {
ivClose -> {
dismiss()
}
butRight -> {
handleRightButClicked()
butSign -> {
handleNormalSignClicked()
}
butWatchAd -> {
gotoWatchAdPage()
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() {
with(mBinding) {
signItem7.setLargeWidthMode()
mSignItemList.add(signItem1)
mSignItemList.add(signItem2)
mSignItemList.add(signItem3)
mSignItemList.add(signItem4)
mSignItemList.add(signItem5)
mSignItemList.add(signItem6)
mSignItemList.add(signItem7)
mSignItemViewList.add(signItem1)
mSignItemViewList.add(signItem2)
mSignItemViewList.add(signItem3)
mSignItemViewList.add(signItem4)
mSignItemViewList.add(signItem5)
mSignItemViewList.add(signItem6)
mSignItemViewList.add(signItem7)
mDataList?.let {
mSignItemList.forEachIndexed { index, itemView->
itemView.setData(mDataList!![index], { isSelected ->
mRewardDetailList?.let {
mSignItemViewList.forEachIndexed { index, itemView->
itemView.setData(mRewardDetailList!![index], { isSelected ->
handleItemSelectStateChanged(index, isSelected)
})
}
@ -69,11 +81,13 @@ class DailySignDialog(context: Context) : BindingDialog<DialogDailySignBinding>(
private fun initSignState() {
mCurDayIndex = TaskManager.instance().getCurDayIndexOfDailyCheckIn()
mSignItemList[mCurDayIndex].setSelectState(true)
mSelectedDayIndex = mCurDayIndex
mSignItemViewList[mCurDayIndex].setSelectState(true)
}
private fun handleItemSelectStateChanged(itemIndex: Int, selected: Boolean) {
mSignItemList.forEachIndexed { index, itemView ->
mSelectedDayIndex = itemIndex
mSignItemViewList.forEachIndexed { index, itemView ->
if (itemIndex != index) {
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()
@Volatile
private var initialized = false
private var mTaskConfig: TaskBean? = null
private var mTaskBean: TaskStateBean = TaskStateBean(DailySignBean())
private var mDailySignData: DailySignBean = DailySignBean()
private val mGson = GsonBuilder().create()
@ -67,7 +68,7 @@ class TaskManager private constructor() {
mutex.withLock {
if (!initialized) {
loadTaskConfigFromAsset()
loadTaskStateFromSp()
loadTaskStatesFromSp()
}
}
}
@ -82,13 +83,13 @@ class TaskManager private constructor() {
}
private suspend fun loadTaskStateFromSp() {
private suspend fun loadTaskStatesFromSp() {
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) {
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
} else {
mTaskBean = taskStateBeanInSp
mDailySignData = taskStateBeanInSp
}
}
}
@ -138,22 +139,39 @@ class TaskManager private constructor() {
fun getCurDayIndexOfDailyCheckIn() : Int {
val periodStartMs = mTaskBean.dailySignBean.startMs
var dayIndexOfPeriod = 0
val periodStartMs = mDailySignData.startMs
if (periodStartMs > 0) {
val dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
if (dayIndexOfPeriod > 6) {
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs()
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
mDailySignData.startMs = DateUtil.getCurTimeMs()
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
}
return dayIndexOfPeriod
} else {
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs()
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
return 0
}
mDailySignData.startMs = DateUtil.getCurTimeMs()
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData)
}
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
import com.ama.core.architecture.util.DateUtil
import com.gamedog.vididin.manager.DailySignBean.Companion.SIGN_STATE_DISABLE
import java.io.Serializable
data class TaskStateBean(
val dailySignBean: DailySignBean
): Serializable
data class DailySignBean(
var startMs: Long = 0,
val signStateList: MutableList<Int> = mutableListOf()
val signStateList: MutableList<DailySignDayInfoBean> = mutableListOf()
): Serializable {
companion object{
const val SIGN_STATE_ENABLE = 1
const val SIGN_STATE_WAIT = 2
const val SIGN_STATE_FORGOT = 3
const val SIGN_STATE_DISABLE = 2
const val SIGN_STATE_DONE = 3
const val SIGN_STATE_FORGOT = 4
}
init {
signStateList.add(SIGN_STATE_ENABLE)
signStateList.add(SIGN_STATE_WAIT)
signStateList.add(SIGN_STATE_WAIT)
signStateList.add(SIGN_STATE_WAIT)
signStateList.add(SIGN_STATE_WAIT)
signStateList.add(SIGN_STATE_WAIT)
signStateList.add(SIGN_STATE_WAIT)
signStateList.add(DailySignDayInfoBean(signState = SIGN_STATE_ENABLE))
signStateList.add(DailySignDayInfoBean())
signStateList.add(DailySignDayInfoBean())
signStateList.add(DailySignDayInfoBean())
signStateList.add(DailySignDayInfoBean())
signStateList.add(DailySignDayInfoBean())
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 {
mBinding = DailySignItemBinding.inflate(LayoutInflater.from(context), this, true)
mBinding.run {
setOnClickBatch(contentRoot) {
setOnClickBatch(contentRoot, ) {
when(this) {
contentRoot -> {
if (!mIsSelected) {

View File

@ -151,7 +151,7 @@
android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/but_left"
android:id="@+id/but_sign"
android:layout_width="0dp"
android:layout_height="42dp"
android:layout_weight="1"
@ -164,7 +164,7 @@
<FrameLayout
android:id="@+id/but_right"
android:id="@+id/but_watch_ad"
android:layout_width="0dp"
android:layout_height="wrap_content"
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="version">Version\n</string>
<string name="title_cash_record">Dinheiro</string>
<string name="sign_success_desc">Você ganhou uma recompensa!</string>
</resources>

View File

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