From 738b0b3ae94842385c9066ecac4845eeef8d1d49 Mon Sep 17 00:00:00 2001 From: renhaoting <370797079@qq.com> Date: Mon, 1 Dec 2025 14:46:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96taskmanager=20=E7=BB=93?= =?UTF-8?q?=E6=9E=84+1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gamedog/vididin/manager/TaskManager.kt | 160 ++---------------- .../vididin/manager/helpers/BaseHelper.kt | 41 +++++ .../manager/helpers/DailySignTaskHelper.kt | 138 +++++++++++++++ .../helpers/DailyWatchVideoTaskHelper.kt | 48 ++++++ .../TaskDailySignBean.kt} | 16 +- .../manager/taskbeans/TaskStateWatchVideo.kt | 17 ++ .../vididin/widget/DailySignItemView.kt | 2 +- .../com/ama/core/architecture/util/SpUtil.kt | 20 ++- 8 files changed, 275 insertions(+), 167 deletions(-) create mode 100644 app/src/main/java/com/gamedog/vididin/manager/helpers/BaseHelper.kt create mode 100644 app/src/main/java/com/gamedog/vididin/manager/helpers/DailySignTaskHelper.kt create mode 100644 app/src/main/java/com/gamedog/vididin/manager/helpers/DailyWatchVideoTaskHelper.kt rename app/src/main/java/com/gamedog/vididin/manager/{TaskStateBean.kt => taskbeans/TaskDailySignBean.kt} (70%) create mode 100644 app/src/main/java/com/gamedog/vididin/manager/taskbeans/TaskStateWatchVideo.kt diff --git a/app/src/main/java/com/gamedog/vididin/manager/TaskManager.kt b/app/src/main/java/com/gamedog/vididin/manager/TaskManager.kt index 5ff40cb..48ce4e1 100644 --- a/app/src/main/java/com/gamedog/vididin/manager/TaskManager.kt +++ b/app/src/main/java/com/gamedog/vididin/manager/TaskManager.kt @@ -1,13 +1,10 @@ package com.gamedog.vididin.manager -import com.ama.core.architecture.util.DateUtil import com.ama.core.architecture.util.FileUtil -import com.ama.core.architecture.util.SpUtil -import com.ama.core.architecture.util.eventbus.NotifyMan -import com.gamedog.vididin.VididinEvents -import com.gamedog.vididin.core.login.login.AccountManager import com.gamedog.vididin.main.fragments.task.Task import com.gamedog.vididin.main.fragments.task.TaskBean +import com.gamedog.vididin.manager.helpers.DailySignTaskHelper +import com.gamedog.vididin.manager.helpers.DailyWatchVideoTaskHelper import com.google.gson.GsonBuilder import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock @@ -48,9 +45,9 @@ class TaskManager private constructor() { - private val mDailySignTaskHelper: DailySignTaskHelper by lazy { - DailySignTaskHelper() - } + private val mDailySignTaskHelper by lazy { DailySignTaskHelper() } + + private val mDailyWatchVideoTaskHelper by lazy { DailyWatchVideoTaskHelper() } private val mutex = Mutex() @@ -83,7 +80,6 @@ class TaskManager private constructor() { mutex.withLock { if (!initialized) { loadTaskConfigFromAsset() - mDailySignTaskHelper.loadTaskStatesFromSp() initHelpers() } } @@ -101,8 +97,9 @@ class TaskManager private constructor() { - private fun initHelpers() { - mDailySignTaskHelper.setTaskConfig(getDailyCheckInTask()!!) + private suspend fun initHelpers() { + mDailySignTaskHelper.initDatas(getDailyCheckInTask()!!) + mDailyWatchVideoTaskHelper.initDatas(getDailyVideoTask()!!) } @@ -116,6 +113,10 @@ class TaskManager private constructor() { return mDailySignTaskHelper } + fun dailyWatchTask(): DailyWatchVideoTaskHelper { + return mDailyWatchVideoTaskHelper + } + //------------------------- Get tasks ------------------------------- @@ -170,143 +171,6 @@ private class ConfigHelper { } -class DailySignTaskHelper() { - private var mCurDayIndexDailySign: Int = 0 - private var mDailySignData: DailySignBean = DailySignBean() - private lateinit var mTaskConfig: Task - - fun setTaskConfig(taskConfig: Task) { - mTaskConfig = taskConfig - } - - suspend fun loadTaskStatesFromSp() { - return withContext(Dispatchers.IO) { - val taskStateBeanInSp = SpUtil.instance().getObject(SpUtil.KEY_TASK_BEAN) - if (taskStateBeanInSp == null) { - SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) - } else { - mDailySignData = taskStateBeanInSp - } - } - } - - - fun getCurDayIndexOfDailyCheckIn() : Int { - var dayIndexOfPeriod = 0 - - val periodStartMs = mDailySignData.startMs - if (periodStartMs > 0) { - dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs()) - if (dayIndexOfPeriod > 6) { - mDailySignData.startMs = DateUtil.getCurTimeMs() - SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) - } - } else { - mDailySignData.startMs = DateUtil.getCurTimeMs() - SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) - } - - mCurDayIndexDailySign = dayIndexOfPeriod - return dayIndexOfPeriod - } - - fun getDailySignStateBean(dayIndex: Int): DailySignDayInfoBean { - return mDailySignData.signStateList[dayIndex] - } - - fun executeDailySign(dayIndex: Int, isDoubleReward: Boolean, isByAd: Boolean) : Boolean { - val daySignState = mDailySignData.signStateList[dayIndex] - - if (!daySignState.hasSigned || (dayIndex == mCurDayIndexDailySign && !daySignState.hasWatchedAd)) { - val dayReward = getRewardNumOfDailySign(dayIndex) - val finalReward = if (isDoubleReward) 2*dayReward else dayReward - daySignState.hasRewardedNum += finalReward - daySignState.hasSigned = true - daySignState.hasWatchedAd = isByAd - saveDailySignInfo() - AccountManager.addGold(finalReward) - notifySignStateChanged(Pair(dayIndex, daySignState)) - return true - } - return false - } - - private fun notifySignStateChanged(dataPair: Pair) { - NotifyMan.instance().sendEvent(VididinEvents.Event_Sign_State_Changed, NotifyMan.NotifyData(dataPair)) - } - - private fun saveDailySignInfo() { - SpUtil.instance().putObject(SpUtil.KEY_DAILY_SIGN, mDailySignData) - } - - fun generateTestDailySignTestBean() { - mDailySignData = DailySignBean().apply { - startMs = DateUtil.getCurTimeMs() - 4 * DateUtil.MS_NUM_ONE_DAY - signStateList.clear() - signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = true)) - signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) - signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = false)) - signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) - signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) - signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) - signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) - } - - SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) - AccountManager.saveBankAccount(null) - } - - fun getForgotSignDays(): Int { - var forgotSignDays = 0 - val curDayIndex = getCurDayIndexOfDailyCheckIn() - mDailySignData.signStateList.forEachIndexed { index, item-> - if (!item.hasSigned && index < curDayIndex) { - forgotSignDays++ - } - } - return forgotSignDays - } - - fun getSignDaysTotal(): Int { - var signDays = 0 - mDailySignData.signStateList.forEachIndexed { index, item-> - if (item.hasSigned) { - signDays++ - } - } - return signDays - } - - fun getForgotSignFirstDayIndex(): Int { - val curDayIndex = getCurDayIndexOfDailyCheckIn() - mDailySignData.signStateList.forEachIndexed { index, item-> - if (!item.hasSigned && index < curDayIndex) { - return index - } - } - return -1; - } - - - fun getDayStateList(): List { - return mDailySignData.signStateList - } - - fun getRewardNumOfDailySign(dayIndex: Int) : Int { - return mTaskConfig.reward_details[dayIndex].value - } - - fun isDailySignAllOperationDone(): Boolean { - val curDayState = getDailySignStateBean(mCurDayIndexDailySign) - return curDayState.hasSigned && curDayState.hasWatchedAd && getForgotSignFirstDayIndex() <= 0 - } - -} - -private class DailyWatchVideoTaskHelper { - -} - private class DailyBoxTaskHelper { } diff --git a/app/src/main/java/com/gamedog/vididin/manager/helpers/BaseHelper.kt b/app/src/main/java/com/gamedog/vididin/manager/helpers/BaseHelper.kt new file mode 100644 index 0000000..d34b3b4 --- /dev/null +++ b/app/src/main/java/com/gamedog/vididin/manager/helpers/BaseHelper.kt @@ -0,0 +1,41 @@ +package com.gamedog.vididin.manager.helpers + +import com.ama.core.architecture.util.eventbus.NotifyMan +import com.gamedog.vididin.main.fragments.task.Task +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext + +abstract class BaseHelper { + protected lateinit var mTaskConfig: Task + private var mEventCallback: NotifyMan.ICallback? = null + + abstract fun loadTaskFromSp() + + suspend fun initDatas(taskConfig: Task) { + mTaskConfig = taskConfig + + return withContext(Dispatchers.IO) { + loadTaskFromSp() + } + } + + + + protected fun registerEvents(onEvents: ((NotifyMan.NotifyData<*>?)->Unit), vararg eventTypes: Int) { + if (mEventCallback == null) { + mEventCallback = object : NotifyMan.ICallback(true) { + override fun onEvent(data: NotifyMan.NotifyData<*>?) { + onEvents.invoke(data) + } + } + } + + NotifyMan.instance().register(mEventCallback, *eventTypes) + } + + fun release() { + NotifyMan.instance().unregister(mEventCallback) + } + + +} \ No newline at end of file diff --git a/app/src/main/java/com/gamedog/vididin/manager/helpers/DailySignTaskHelper.kt b/app/src/main/java/com/gamedog/vididin/manager/helpers/DailySignTaskHelper.kt new file mode 100644 index 0000000..5c9767a --- /dev/null +++ b/app/src/main/java/com/gamedog/vididin/manager/helpers/DailySignTaskHelper.kt @@ -0,0 +1,138 @@ +package com.gamedog.vididin.manager.helpers + +import com.ama.core.architecture.util.DateUtil +import com.ama.core.architecture.util.SpUtil +import com.ama.core.architecture.util.eventbus.NotifyMan +import com.gamedog.vididin.VididinEvents +import com.gamedog.vididin.core.login.login.AccountManager +import com.gamedog.vididin.manager.taskbeans.TaskDailySignBean +import com.gamedog.vididin.manager.taskbeans.DailySignDayInfoBean + + +class DailySignTaskHelper : BaseHelper() { + private var mCurDayIndexDailySign: Int = 0 + private var mDailySignData: TaskDailySignBean = TaskDailySignBean() + + + + + override fun loadTaskFromSp() { + val taskStateBeanInSp = SpUtil.instance().getObject(SpUtil.KEY_TASK_BEAN) + if (taskStateBeanInSp == null) { + SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) + } else { + mDailySignData = taskStateBeanInSp + } + } + + fun getCurDayIndexOfDailyCheckIn() : Int { + var dayIndexOfPeriod = 0 + + val periodStartMs = mDailySignData.startDurationMs + if (periodStartMs > 0) { + dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs()) + if (dayIndexOfPeriod > 6) { + mDailySignData.startDurationMs = DateUtil.getCurTimeMs() + SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) + } + } else { + mDailySignData.startDurationMs = DateUtil.getCurTimeMs() + SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) + } + + mCurDayIndexDailySign = dayIndexOfPeriod + return dayIndexOfPeriod + } + + fun getDailySignStateBean(dayIndex: Int): DailySignDayInfoBean { + return mDailySignData.signStateList[dayIndex] + } + + fun executeDailySign(dayIndex: Int, isDoubleReward: Boolean, isByAd: Boolean) : Boolean { + val daySignState = mDailySignData.signStateList[dayIndex] + + if (!daySignState.hasSigned || (dayIndex == mCurDayIndexDailySign && !daySignState.hasWatchedAd)) { + val dayReward = getRewardNumOfDailySign(dayIndex) + val finalReward = if (isDoubleReward) 2*dayReward else dayReward + daySignState.hasRewardedNum += finalReward + daySignState.hasSigned = true + daySignState.hasWatchedAd = isByAd + saveDailySignInfo() + AccountManager.addGold(finalReward) + notifySignStateChanged(Pair(dayIndex, daySignState)) + return true + } + return false + } + + private fun notifySignStateChanged(dataPair: Pair) { + NotifyMan.instance().sendEvent(VididinEvents.Event_Sign_State_Changed, NotifyMan.NotifyData(dataPair)) + } + + private fun saveDailySignInfo() { + SpUtil.instance().putObject(SpUtil.KEY_DAILY_SIGN, mDailySignData) + } + + fun generateTestDailySignTestBean() { + mDailySignData = TaskDailySignBean().apply { + startDurationMs = DateUtil.getCurTimeMs() - 4 * DateUtil.MS_NUM_ONE_DAY + signStateList.clear() + signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = true)) + signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) + signStateList.add(DailySignDayInfoBean(hasSigned = true, hasWatchedAd = false)) + signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) + signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) + signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) + signStateList.add(DailySignDayInfoBean(hasSigned = false, hasWatchedAd = false)) + } + + SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mDailySignData) + AccountManager.saveBankAccount(null) + } + + fun getForgotSignDays(): Int { + var forgotSignDays = 0 + val curDayIndex = getCurDayIndexOfDailyCheckIn() + mDailySignData.signStateList.forEachIndexed { index, item-> + if (!item.hasSigned && index < curDayIndex) { + forgotSignDays++ + } + } + return forgotSignDays + } + + fun getSignDaysTotal(): Int { + var signDays = 0 + mDailySignData.signStateList.forEachIndexed { index, item-> + if (item.hasSigned) { + signDays++ + } + } + return signDays + } + + fun getForgotSignFirstDayIndex(): Int { + val curDayIndex = getCurDayIndexOfDailyCheckIn() + mDailySignData.signStateList.forEachIndexed { index, item-> + if (!item.hasSigned && index < curDayIndex) { + return index + } + } + return -1; + } + + + fun getDayStateList(): List { + return mDailySignData.signStateList + } + + fun getRewardNumOfDailySign(dayIndex: Int) : Int { + return mTaskConfig.reward_details[dayIndex].value + } + + fun isDailySignAllOperationDone(): Boolean { + val curDayState = getDailySignStateBean(mCurDayIndexDailySign) + return curDayState.hasSigned && curDayState.hasWatchedAd && getForgotSignFirstDayIndex() <= 0 + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/gamedog/vididin/manager/helpers/DailyWatchVideoTaskHelper.kt b/app/src/main/java/com/gamedog/vididin/manager/helpers/DailyWatchVideoTaskHelper.kt new file mode 100644 index 0000000..ef7ceea --- /dev/null +++ b/app/src/main/java/com/gamedog/vididin/manager/helpers/DailyWatchVideoTaskHelper.kt @@ -0,0 +1,48 @@ +package com.gamedog.vididin.manager.helpers + +import com.ama.core.architecture.util.DateUtil +import com.ama.core.architecture.util.SpUtil +import com.gamedog.vididin.VididinEvents +import com.gamedog.vididin.manager.taskbeans.DailyStateWatchVideoBean +import java.util.concurrent.ConcurrentHashMap + + + +class DailyWatchVideoTaskHelper : BaseHelper() { + + private var mStateBean: DailyStateWatchVideoBean? = null + private val mWatchedMap = ConcurrentHashMap() + + + init { + registerEvents( { eventData-> + val dataPair: Pair = eventData?.mData as Pair + addWatchedVideoInfo(dataPair) + }, VididinEvents.Event_Finish_Video) + } + + override fun loadTaskFromSp() { + mStateBean = SpUtil.instance().getObject(SpUtil.KEY_DAILY_WATCH) + + if (mStateBean == null || !isCurBeanInToday()) { + generateTodayTask() + SpUtil.instance().putObject(SpUtil.KEY_DAILY_WATCH, mStateBean) + } + } + + + private fun generateTodayTask() { + mStateBean = DailyStateWatchVideoBean(DateUtil.getCurTimeMs()) + } + + private fun isCurBeanInToday(): Boolean { + return mStateBean != null && DateUtil.isToday(mStateBean?.todayStartMs!!) + } + + private fun addWatchedVideoInfo(dataPair: Pair) { + mWatchedMap.put(dataPair.first, dataPair.second) + } + + + +} \ No newline at end of file diff --git a/app/src/main/java/com/gamedog/vididin/manager/TaskStateBean.kt b/app/src/main/java/com/gamedog/vididin/manager/taskbeans/TaskDailySignBean.kt similarity index 70% rename from app/src/main/java/com/gamedog/vididin/manager/TaskStateBean.kt rename to app/src/main/java/com/gamedog/vididin/manager/taskbeans/TaskDailySignBean.kt index 4375da0..84eddf9 100644 --- a/app/src/main/java/com/gamedog/vididin/manager/TaskStateBean.kt +++ b/app/src/main/java/com/gamedog/vididin/manager/taskbeans/TaskDailySignBean.kt @@ -1,22 +1,12 @@ -package com.gamedog.vididin.manager +package com.gamedog.vididin.manager.taskbeans import java.io.Serializable - - -data class DailySignBean( - var startMs: Long = 0, +data class TaskDailySignBean( + var startDurationMs: Long = 0, val signStateList: MutableList = mutableListOf() - ): Serializable { - companion object{ - const val SIGN_STATE_ENABLE = 1 - const val SIGN_STATE_DISABLE = 2 - const val SIGN_STATE_DONE = 3 - const val SIGN_STATE_FORGOT = 4 - } - init { signStateList.add(DailySignDayInfoBean()) signStateList.add(DailySignDayInfoBean()) diff --git a/app/src/main/java/com/gamedog/vididin/manager/taskbeans/TaskStateWatchVideo.kt b/app/src/main/java/com/gamedog/vididin/manager/taskbeans/TaskStateWatchVideo.kt new file mode 100644 index 0000000..bd5af4e --- /dev/null +++ b/app/src/main/java/com/gamedog/vididin/manager/taskbeans/TaskStateWatchVideo.kt @@ -0,0 +1,17 @@ +package com.gamedog.vididin.manager.taskbeans + +import java.io.Serializable + + + + +data class DailyStateWatchVideoBean( + var todayStartMs: Long = 0, + var watchedVideoNum: Int = 0, +): Serializable { + +} + + + + diff --git a/app/src/main/java/com/gamedog/vididin/widget/DailySignItemView.kt b/app/src/main/java/com/gamedog/vididin/widget/DailySignItemView.kt index e577e7d..9bccc93 100644 --- a/app/src/main/java/com/gamedog/vididin/widget/DailySignItemView.kt +++ b/app/src/main/java/com/gamedog/vididin/widget/DailySignItemView.kt @@ -10,7 +10,7 @@ import com.ama.core.architecture.util.ResUtil import com.gamedog.vididin.R import com.gamedog.vididin.databinding.DailySignItemBinding import com.gamedog.vididin.main.fragments.task.RewardDetail -import com.gamedog.vididin.manager.DailySignDayInfoBean +import com.gamedog.vididin.manager.taskbeans.DailySignDayInfoBean import kotlin.run class DailySignItemView @JvmOverloads constructor( diff --git a/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt b/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt index 58a27cc..34ef5ec 100644 --- a/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt +++ b/core/architecture/src/main/java/com/ama/core/architecture/util/SpUtil.kt @@ -12,12 +12,22 @@ import java.nio.charset.Charset class SpUtil private constructor(spFileName: String) { companion object { - 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 = "VidiDin_Common" + + + + const val KEY_ACCOUNT = "KEY_ACCOUNT" + const val KEY_TASK_BEAN = "KEY_TASK_BEAN" + + + // Various tasks + const val KEY_DAILY_SIGN = "KEY_DAILY_SIGN" + const val KEY_DAILY_WATCH = "KEY_DAILY_WATCH" + + + + - private const val DEFAULT_SP_NAME = "enhanced_prefs" @Volatile private var instance: SpUtil? = null fun instance(prefName: String = DEFAULT_SP_NAME): SpUtil {