优化taskmanager 结构+1

This commit is contained in:
renhaoting 2025-12-01 14:46:11 +08:00
parent 5fdf3a4ad9
commit 738b0b3ae9
8 changed files with 275 additions and 167 deletions

View File

@ -1,13 +1,10 @@
package com.gamedog.vididin.manager 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.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.Task
import com.gamedog.vididin.main.fragments.task.TaskBean 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 com.google.gson.GsonBuilder
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
@ -48,9 +45,9 @@ class TaskManager private constructor() {
private val mDailySignTaskHelper: DailySignTaskHelper by lazy { private val mDailySignTaskHelper by lazy { DailySignTaskHelper() }
DailySignTaskHelper()
} private val mDailyWatchVideoTaskHelper by lazy { DailyWatchVideoTaskHelper() }
private val mutex = Mutex() private val mutex = Mutex()
@ -83,7 +80,6 @@ class TaskManager private constructor() {
mutex.withLock { mutex.withLock {
if (!initialized) { if (!initialized) {
loadTaskConfigFromAsset() loadTaskConfigFromAsset()
mDailySignTaskHelper.loadTaskStatesFromSp()
initHelpers() initHelpers()
} }
} }
@ -101,8 +97,9 @@ class TaskManager private constructor() {
private fun initHelpers() { private suspend fun initHelpers() {
mDailySignTaskHelper.setTaskConfig(getDailyCheckInTask()!!) mDailySignTaskHelper.initDatas(getDailyCheckInTask()!!)
mDailyWatchVideoTaskHelper.initDatas(getDailyVideoTask()!!)
} }
@ -116,6 +113,10 @@ class TaskManager private constructor() {
return mDailySignTaskHelper return mDailySignTaskHelper
} }
fun dailyWatchTask(): DailyWatchVideoTaskHelper {
return mDailyWatchVideoTaskHelper
}
//------------------------- Get tasks ------------------------------- //------------------------- 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<DailySignBean>(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<Int, DailySignDayInfoBean>) {
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<DailySignDayInfoBean> {
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 { private class DailyBoxTaskHelper {
} }

View File

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

View File

@ -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<TaskDailySignBean>(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<Int, DailySignDayInfoBean>) {
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<DailySignDayInfoBean> {
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
}
}

View File

@ -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<String, Long>()
init {
registerEvents( { eventData->
val dataPair: Pair<String, Long> = eventData?.mData as Pair<String, Long>
addWatchedVideoInfo(dataPair)
}, VididinEvents.Event_Finish_Video)
}
override fun loadTaskFromSp() {
mStateBean = SpUtil.instance().getObject<DailyStateWatchVideoBean>(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<String, Long>) {
mWatchedMap.put(dataPair.first, dataPair.second)
}
}

View File

@ -1,22 +1,12 @@
package com.gamedog.vididin.manager package com.gamedog.vididin.manager.taskbeans
import java.io.Serializable import java.io.Serializable
data class TaskDailySignBean(
var startDurationMs: Long = 0,
data class DailySignBean(
var startMs: Long = 0,
val signStateList: MutableList<DailySignDayInfoBean> = mutableListOf() val signStateList: MutableList<DailySignDayInfoBean> = mutableListOf()
): Serializable { ): 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 { init {
signStateList.add(DailySignDayInfoBean()) signStateList.add(DailySignDayInfoBean())
signStateList.add(DailySignDayInfoBean()) signStateList.add(DailySignDayInfoBean())

View File

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

View File

@ -10,7 +10,7 @@ import com.ama.core.architecture.util.ResUtil
import com.gamedog.vididin.R import com.gamedog.vididin.R
import com.gamedog.vididin.databinding.DailySignItemBinding import com.gamedog.vididin.databinding.DailySignItemBinding
import com.gamedog.vididin.main.fragments.task.RewardDetail import com.gamedog.vididin.main.fragments.task.RewardDetail
import com.gamedog.vididin.manager.DailySignDayInfoBean import com.gamedog.vididin.manager.taskbeans.DailySignDayInfoBean
import kotlin.run import kotlin.run
class DailySignItemView @JvmOverloads constructor( class DailySignItemView @JvmOverloads constructor(

View File

@ -12,12 +12,22 @@ import java.nio.charset.Charset
class SpUtil private constructor(spFileName: String) { class SpUtil private constructor(spFileName: String) {
companion object { companion object {
const val KEY_ACCOUNT = "KEY_ACCOUNT" private const val DEFAULT_SP_NAME = "VidiDin_Common"
const val KEY_ACCOUNT_TOKEN = "KEY_ACCOUNT_TOKEN"
const val KEY_TASK_BEAN = "KEY_TASK_BEAN"
const val KEY_DAILY_SIGN = "KEY_DAILY_SIGN"
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 @Volatile
private var instance: SpUtil? = null private var instance: SpUtil? = null
fun instance(prefName: String = DEFAULT_SP_NAME): SpUtil { fun instance(prefName: String = DEFAULT_SP_NAME): SpUtil {