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.gamedog.vididin.main.fragments.task.Task 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 { // 新手任务分类及其子类 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" @Volatile private var instance: TaskManager? = null fun instance(): TaskManager { return instance ?: synchronized(this) { instance ?: TaskManager().also { instance = it } } } } private val mutex = Mutex() @Volatile private var initialized = false private var mTaskConfig: TaskBean? = null private var mTaskBean: TaskStateBean = TaskStateBean(DailySignBean()) private val mGson = GsonBuilder().create() init { loadTaskConfigAsync() } suspend fun getTaskConfig(): TaskBean? = mutex.withLock { if (!initialized) { loadTaskConfigFromAsset() } return mTaskConfig } private fun loadTaskConfigAsync() { CoroutineScope(Dispatchers.IO).launch { mutex.withLock { if (!initialized) { loadTaskConfigFromAsset() loadTaskStateFromSp() } } } } private suspend fun loadTaskConfigFromAsset() { return withContext(Dispatchers.IO) { val configStr = FileUtil.readAssetsFile("taskConfig.json") mTaskConfig = mGson.fromJson(configStr, TaskBean::class.java) initialized = true } } private suspend fun loadTaskStateFromSp() { return withContext(Dispatchers.IO) { val taskStateBeanInSp = SpUtil.instance().getObject(SpUtil.KEY_TASK_BEAN) if (taskStateBeanInSp == null) { SpUtil.instance().putObject(SpUtil.KEY_TASK_BEAN, mTaskBean) } else { mTaskBean = taskStateBeanInSp } } } //------------------------- Get tasks ------------------------------- // 日常任务 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) } //----------------------------- 每日签到 -----------------------------// fun getHomeWatchDurationRewardNum(): Int { return 28; // TODO - mTaskConfigBean.xxxx } 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 } } }