/* * Copyright (C) 2016 AriaLyy(https://github.com/AriaLyy/Aria) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.arialyy.dua.group import android.os.Handler import android.os.Looper import com.arialyy.aria.core.inf.IBlockManager import com.arialyy.aria.core.inf.ITaskManager import com.arialyy.aria.core.task.ITask import com.arialyy.aria.http.HttpTaskOption import com.arialyy.aria.http.download.HttpDOptionAdapter import timber.log.Timber /** * @Author laoyuyu * @Description * @Date 10:04 2023/3/12 **/ internal class HttpSubBlockManager(private val task: ITask, private val groupHandler: Handler) : IBlockManager { private lateinit var looper: Looper private lateinit var handler: Handler private var isStop = false private var isCancel = false /** * Pass the message to the group task after the subtask is stopped */ private val callback = Handler.Callback { msg -> when (msg.what) { ITaskManager.STATE_STOP -> { isStop = true } ITaskManager.STATE_CANCEL -> { isCancel = true } ITaskManager.STATE_FAIL -> { } ITaskManager.STATE_COMPLETE -> { } ITaskManager.STATE_RUNNING -> { } ITaskManager.STATE_UPDATE_PROGRESS -> { } } false } override fun getHandler() = handler /** * 1.Shared thread pool for subtasks [HttpDGTaskManager.dispatcher] * 2.Subtasks support only single block downloads */ override fun start() { if (Looper.myLooper() == Looper.getMainLooper()) { throw IllegalThreadStateException("io operations cannot be in the main thread") } looper = Looper.myLooper()!! handler = Handler(looper, callback) // Synchronized sequential execution of all block task.getTaskOption(HttpTaskOption::class.java) .getOptionAdapter(HttpDOptionAdapter::class.java).threadList.forEach { tt -> if (isStop) { Timber.d("task stopped") return } if (isCancel) { Timber.d("task canceled") return } tt.run() } } private fun quitLooper() { looper.quit() handler.removeCallbacksAndMessages(null) } override fun setBlockNum(blockNum: Int) { Timber.i("Subtasks do not support chunked downloads") } }