VidiDin-Android/app/src/main/java/com/gamedog/vididin/manager/TaskManager.kt

213 lines
7.2 KiB
Kotlin

package com.gamedog.vididin.manager
import com.ama.core.architecture.util.FileUtil
import com.ama.core.architecture.util.eventbus.NotifyMan
import com.gamedog.vididin.VidiConst
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.DailyBoxHelper
import com.gamedog.vididin.manager.helpers.DailySignTaskHelper
import com.gamedog.vididin.manager.helpers.DailyWatchAdTaskHelper
import com.gamedog.vididin.manager.helpers.DailyWatchVideoTaskHelper
import com.gamedog.vididin.manager.helpers.NewbieEnableNotifyHelper
import com.gamedog.vididin.manager.helpers.NewbieFirstWithdrawHelper
import com.gamedog.vididin.manager.helpers.NewbieJoinDiscordHelper
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
}
}
}
}
@Volatile
private var initialized = false
private val mutex = Mutex()
private val mGson = GsonBuilder().create()
private var mTaskConfig: TaskBean? = null
private val mDailySignTaskHelper by lazy { DailySignTaskHelper() }
private val mDailyWatchVideoTaskHelper by lazy { DailyWatchVideoTaskHelper() }
private val mDailyWatchAdTaskHelper by lazy { DailyWatchAdTaskHelper() }
private val mDailyBoxHelper by lazy { DailyBoxHelper() }
private val mNewbieJoinDiscordHelper by lazy { NewbieJoinDiscordHelper() }
private val mNewbieEnableNotifyHelper by lazy { NewbieEnableNotifyHelper() }
private val mNewbieFirstWithdrawHelper by lazy { NewbieFirstWithdrawHelper() }
init {
loadTaskConfigAsync()
registerEvents()
// TODO - remove test code
if (true) {
mDailySignTaskHelper.generateTestDailySignTestBean()
}
}
private fun registerEvents() {
NotifyMan.instance().register(object : NotifyMan.ICallback(true) {
override fun onEvent(data: NotifyMan.NotifyData<*>?) {
when (data?.mEventType) {
VididinEvents.Event_AD_TASK_TYPE_Convert_Gold_2_Cash -> {
AccountManager.convertGold2Cash()
}
VididinEvents.Event_AD_TASK_TYPE_Watch_Ad_Earn_Gold -> {
AccountManager.addGold(VidiConst.WATCH_AD_REWARD_GOLD)
}
}
}
}, VididinEvents.Event_AD_TASK_TYPE_Convert_Gold_2_Cash, VididinEvents.Event_AD_TASK_TYPE_Watch_Ad_Earn_Gold)
}
suspend fun getTaskConfig(): TaskBean? = mutex.withLock {
if (!initialized) {
loadTaskConfigFromAsset()
}
return mTaskConfig
}
private fun loadTaskConfigAsync() {
CoroutineScope(Dispatchers.IO).launch {
mutex.withLock {
if (!initialized) {
loadTaskConfigFromAsset()
initHelpers()
}
}
}
}
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 initHelpers() {
mDailySignTaskHelper.initDatas(getDailyCheckInTask()!!)
mDailyWatchVideoTaskHelper.initDatas(getDailyVideoTask()!!)
mDailyWatchAdTaskHelper.initDatas(getDailyAdTask()!!)
mDailyBoxHelper.initDatas(getDailyVideoTask()!!) // TODO - get right box task config
mNewbieJoinDiscordHelper.initDatas(getNewbieJoinDiscordTask()!!)
mNewbieEnableNotifyHelper.initDatas(getNewbieEnableNotifyTask()!!)
mNewbieFirstWithdrawHelper.initDatas(getNewbieFirstWithdrawTask()!!)
}
//------------------------- Tasks Getter ------------------------------
fun dailySignStatus(): DailySignTaskHelper {
return mDailySignTaskHelper
}
fun dailyWatchVideoStatus(): DailyWatchVideoTaskHelper {
return mDailyWatchVideoTaskHelper
}
fun dailyWatchAdStatus(): DailyWatchAdTaskHelper {
return mDailyWatchAdTaskHelper
}
fun dailyBoxStatus(): DailyBoxHelper {
return mDailyBoxHelper
}
fun newbieJoinDiscordStatus(): NewbieJoinDiscordHelper {
return mNewbieJoinDiscordHelper
}
fun newbieEnableNotifyStatus(): NewbieEnableNotifyHelper {
return mNewbieEnableNotifyHelper
}
fun newbieFirstWithdrawStatus(): NewbieFirstWithdrawHelper {
return mNewbieFirstWithdrawHelper
}
//------------------------- 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
}
}