package com.duolebo.blyrobot.tools import android.util.Log import com.duolebo.blyrobot.data.Task import java.util.* import kotlin.collections.ArrayList /** * 任务管理类 */ class TaskManager { companion object { val instance = TaskManager() val TAG = "RobotTaskManager" val RUN_TASK_PERIOD: Long = 6 * 60 * 60 * 1000 } val tasks = ArrayList() var isRunning = false private val overTasks = ArrayList() private var currentTask: Task? = null private var scheduleTime: Timer? = null /** * 添加任务 * @param task */ fun add(task: Task) { for (existTask in tasks) { Log.i(TAG, "exist task app: ${existTask.apkInfo.packageName}") } task.taskListener = object : Task.OnTaskListener { override fun onComplete(result: Boolean) { Log.i(TAG, "task ${task.apkInfo.name} complete with result: $result") tasks.remove(task) overTasks.add(task) if (tasks.size == 0) { isRunning = false } } } if (isExist(task)) remove(task) this.tasks.add(task) } fun remove(task: Task) { val item = tasks.find { it.apkInfo.packageName == task.apkInfo.packageName } item?.run { Log.i(TAG, "remove task ${this.apkInfo.packageName}") tasks.remove(this) this.release() } } fun isExist(task: Task): Boolean { val item = tasks.find { it.apkInfo.packageName == task.apkInfo.packageName } return item != null } fun start() { Log.i(TAG, "start...") if (this.isRunning) { Log.i(TAG, "is running") return } if (this.tasks.size == 0) { Log.i(TAG, "no tasks") return } for (task in tasks) { Log.i(TAG, "list tasks: ${task.apkInfo.packageName}") } this.isRunning = true scheduleTime?.run { cancel() } scheduleTime = Timer() scheduleTime!!.schedule(object : TimerTask() { override fun run() { while (isRunning) { if (currentTask != null && currentTask!!.isRunning()) { Log.i(TAG, "task ${currentTask!!.apkInfo.packageName} is running") } else { if (tasks.size == 0) { for (task in overTasks) { task.reset() tasks.add(task) } } if (tasks.size > 0) { currentTask = tasks[0] currentTask!!.start() Log.i(TAG, "task ${currentTask!!.apkInfo.packageName} start") } } Thread.sleep(5 * 1000) } } }, 0, RUN_TASK_PERIOD) } fun stop() { Log.i(TAG, "stop") this.isRunning = false scheduleTime?.run { cancel() } this.tasks.forEach { it.exit() } this.currentTask?.exit() this.currentTask = null this.tasks.clear() this.overTasks.clear() } }