2025-11-20 09:45:17 +00:00
|
|
|
package com.gamedog.vididin.manager
|
|
|
|
|
|
2025-11-26 06:04:30 +00:00
|
|
|
import com.ama.core.architecture.util.DateUtil
|
2025-11-20 09:45:17 +00:00
|
|
|
import com.ama.core.architecture.util.FileUtil
|
2025-11-26 03:52:09 +00:00
|
|
|
import com.ama.core.architecture.util.SpUtil
|
2025-11-25 11:29:09 +00:00
|
|
|
import com.gamedog.vididin.main.fragments.task.Task
|
2025-11-20 09:45:17 +00:00
|
|
|
import com.gamedog.vididin.main.fragments.task.TaskBean
|
|
|
|
|
import com.google.gson.GsonBuilder
|
|
|
|
|
import kotlinx.coroutines.sync.Mutex
|
|
|
|
|
import kotlinx.coroutines.sync.withLock
|
|
|
|
|
import kotlinx.coroutines.*
|
|
|
|
|
|
|
|
|
|
class TaskManager private constructor() {
|
|
|
|
|
companion object {
|
2025-11-25 11:29:09 +00:00
|
|
|
// 新手任务分类及其子类
|
|
|
|
|
private const val TAG_CATEGORY_NEWBIE_TASK = "newbie_task"
|
|
|
|
|
private const val TAG_TASK_NEWBIE_FIRST_WITHDRAW = "newbie_first_withdraw"
|
|
|
|
|
private const val TAG_TASK_NEWBIE_PUSH_NOTIFY = "newbie_push_notify"
|
|
|
|
|
private const val TAG_TASK_NEWBIE_JOIN_DISCORD = "newbie_join_discord"
|
|
|
|
|
private const val TAG_TASK_NEWBIE_7DAY_CHECKIN = "newbie_7day_checkin"
|
|
|
|
|
|
|
|
|
|
// 日常任务分类及其子类
|
|
|
|
|
private const val TAG_CATEGORY_DAILY_TASK = "daily_task"
|
|
|
|
|
private const val TAG_TASK_DAILY_CHECKIN = "daily_checkin"
|
|
|
|
|
private const val TAG_TASK_DAILY_VIDEO = "daily_video_ladder"
|
|
|
|
|
private const val TAG_TASK_DAILY_AD = "daily_ad_ladder"
|
|
|
|
|
|
2025-11-26 03:52:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Volatile
|
|
|
|
|
private var instance: TaskManager? = null
|
|
|
|
|
|
|
|
|
|
fun instance(): TaskManager {
|
|
|
|
|
return instance ?: synchronized(this) {
|
|
|
|
|
instance ?: TaskManager().also {
|
|
|
|
|
instance = it
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-11-20 09:45:17 +00:00
|
|
|
}
|
|
|
|
|
|
2025-11-26 06:04:30 +00:00
|
|
|
|
2025-11-20 09:45:17 +00:00
|
|
|
private val mutex = Mutex()
|
|
|
|
|
|
|
|
|
|
@Volatile
|
|
|
|
|
private var initialized = false
|
2025-11-25 11:29:09 +00:00
|
|
|
private var mTaskConfig: TaskBean? = null
|
2025-11-26 06:04:30 +00:00
|
|
|
private var mTaskBean: TaskStateBean = TaskStateBean(DailySignBean())
|
2025-11-20 09:45:17 +00:00
|
|
|
private val mGson = GsonBuilder().create()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
init {
|
|
|
|
|
loadTaskConfigAsync()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
suspend fun getTaskConfig(): TaskBean? = mutex.withLock {
|
|
|
|
|
if (!initialized) {
|
|
|
|
|
loadTaskConfigFromAsset()
|
|
|
|
|
}
|
2025-11-25 11:29:09 +00:00
|
|
|
return mTaskConfig
|
2025-11-20 09:45:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private fun loadTaskConfigAsync() {
|
|
|
|
|
CoroutineScope(Dispatchers.IO).launch {
|
|
|
|
|
mutex.withLock {
|
|
|
|
|
if (!initialized) {
|
|
|
|
|
loadTaskConfigFromAsset()
|
2025-11-26 03:52:09 +00:00
|
|
|
loadTaskStateFromSp()
|
2025-11-20 09:45:17 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private suspend fun loadTaskConfigFromAsset() {
|
|
|
|
|
return withContext(Dispatchers.IO) {
|
|
|
|
|
val configStr = FileUtil.readAssetsFile("taskConfig.json")
|
2025-11-25 11:29:09 +00:00
|
|
|
mTaskConfig = mGson.fromJson(configStr, TaskBean::class.java)
|
2025-11-20 09:45:17 +00:00
|
|
|
initialized = true
|
|
|
|
|
}
|
|
|
|
|
}
|
2025-11-25 06:59:50 +00:00
|
|
|
|
2025-11-25 11:29:09 +00:00
|
|
|
|
2025-11-26 03:52:09 +00:00
|
|
|
private suspend fun loadTaskStateFromSp() {
|
|
|
|
|
return withContext(Dispatchers.IO) {
|
2025-11-26 06:04:30 +00:00
|
|
|
val taskStateBeanInSp = SpUtil.instance().getObject<TaskStateBean>(SpUtil.KEY_TASK_BEAN)
|
|
|
|
|
if (taskStateBeanInSp == null) {
|
|
|
|
|
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
|
|
|
|
|
} else {
|
|
|
|
|
mTaskBean = taskStateBeanInSp
|
|
|
|
|
}
|
2025-11-26 03:52:09 +00:00
|
|
|
}
|
|
|
|
|
}
|
2025-11-25 11:29:09 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-11-26 03:52:09 +00:00
|
|
|
//------------------------- Get tasks -------------------------------
|
2025-11-25 11:29:09 +00:00
|
|
|
// 日常任务
|
|
|
|
|
fun getDailyCheckInTask(): Task? {
|
|
|
|
|
return mTaskConfig?.task_module_config?.getTaskCategoryById(TAG_CATEGORY_DAILY_TASK)?.getTaskById(TAG_TASK_DAILY_CHECKIN)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getDailyVideoTask(): Task? {
|
|
|
|
|
return mTaskConfig?.task_module_config?.getTaskCategoryById(TAG_CATEGORY_DAILY_TASK)?.getTaskById(TAG_TASK_DAILY_VIDEO)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getDailyAdTask(): Task? {
|
|
|
|
|
return mTaskConfig?.task_module_config?.getTaskCategoryById(TAG_CATEGORY_DAILY_TASK)?.getTaskById(TAG_TASK_DAILY_AD)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 新手任务
|
|
|
|
|
fun getNewbieFirstWithdrawTask(): Task? {
|
|
|
|
|
return mTaskConfig?.task_module_config?.getTaskCategoryById(TAG_CATEGORY_NEWBIE_TASK)?.getTaskById(TAG_TASK_NEWBIE_FIRST_WITHDRAW)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getNewbieEnableNotifyTask(): Task? {
|
|
|
|
|
return mTaskConfig?.task_module_config?.getTaskCategoryById(TAG_CATEGORY_NEWBIE_TASK)?.getTaskById(TAG_TASK_NEWBIE_PUSH_NOTIFY)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getNewbieJoinDiscordTask(): Task? {
|
|
|
|
|
return mTaskConfig?.task_module_config?.getTaskCategoryById(TAG_CATEGORY_NEWBIE_TASK)?.getTaskById(TAG_TASK_NEWBIE_JOIN_DISCORD)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fun getNewbieCheckInTask(): Task? {
|
|
|
|
|
return mTaskConfig?.task_module_config?.getTaskCategoryById(TAG_CATEGORY_NEWBIE_TASK)?.getTaskById(TAG_TASK_NEWBIE_7DAY_CHECKIN)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2025-11-26 03:52:09 +00:00
|
|
|
//----------------------------- 每日签到 -----------------------------//
|
|
|
|
|
|
|
|
|
|
fun getHomeWatchDurationRewardNum(): Int {
|
|
|
|
|
return 28; // TODO - mTaskConfigBean.xxxx
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-11-26 06:04:30 +00:00
|
|
|
fun getCurDayIndexOfDailyCheckIn() : Int {
|
|
|
|
|
val periodStartMs = mTaskBean.dailySignBean.startMs
|
|
|
|
|
|
|
|
|
|
if (periodStartMs > 0) {
|
|
|
|
|
val dayIndexOfPeriod = DateUtil.getPassedDayNum(periodStartMs, DateUtil.getCurTimeMs())
|
|
|
|
|
if (dayIndexOfPeriod > 6) {
|
|
|
|
|
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs()
|
|
|
|
|
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
|
|
|
|
|
}
|
|
|
|
|
return dayIndexOfPeriod
|
|
|
|
|
} else {
|
|
|
|
|
mTaskBean.dailySignBean.startMs = DateUtil.getCurTimeMs()
|
|
|
|
|
SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean)
|
|
|
|
|
return 0
|
|
|
|
|
}
|
2025-11-26 03:52:09 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2025-11-20 09:45:17 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|