From b201ed163eb4a06c61fc948d649266f8633213aa Mon Sep 17 00:00:00 2001 From: AntsyLich <59261191+AntsyLich@users.noreply.github.com> Date: Thu, 9 Apr 2026 23:24:13 +0600 Subject: [PATCH] Remove usage of deprecated `LocalBroadcastManager` (#3215) --- .../extension/installer/Installer.kt | 37 ++++++++----------- .../extension/util/ExtensionInstaller.kt | 6 ++- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/Installer.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/Installer.kt index 3a2200632..97ef6b3fb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/installer/Installer.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/installer/Installer.kt @@ -1,15 +1,17 @@ package eu.kanade.tachiyomi.extension.installer import android.app.Service -import android.content.BroadcastReceiver -import android.content.Context -import android.content.Intent -import android.content.IntentFilter import android.net.Uri import androidx.annotation.CallSuper -import androidx.localbroadcastmanager.content.LocalBroadcastManager import eu.kanade.tachiyomi.extension.ExtensionManager import eu.kanade.tachiyomi.extension.model.InstallStep +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.cancel +import kotlinx.coroutines.channels.Channel +import kotlinx.coroutines.flow.launchIn +import kotlinx.coroutines.flow.onEach +import kotlinx.coroutines.flow.receiveAsFlow import uy.kohesive.injekt.injectLazy import java.util.Collections import kotlin.concurrent.atomics.AtomicReference @@ -26,13 +28,6 @@ abstract class Installer(private val service: Service) { private var waitingInstall = AtomicReference(null) private val queue = Collections.synchronizedList(mutableListOf()) - private val cancelReceiver = object : BroadcastReceiver() { - override fun onReceive(context: Context, intent: Intent) { - val downloadId = intent.getLongExtra(EXTRA_DOWNLOAD_ID, -1).takeIf { it >= 0 } ?: return - cancelQueue(downloadId) - } - } - /** * Installer readiness. If false, queue check will not run. * @@ -114,7 +109,7 @@ abstract class Installer(private val service: Service) { */ @CallSuper open fun onDestroy() { - LocalBroadcastManager.getInstance(service).unregisterReceiver(cancelReceiver) + scope.cancel() queue.forEach { extensionManager.updateInstallStep(it.downloadId, InstallStep.Error) } queue.clear() waitingInstall.store(null) @@ -149,24 +144,24 @@ abstract class Installer(private val service: Service) { */ data class Entry(val downloadId: Long, val uri: Uri) + private val scope = CoroutineScope(Dispatchers.Main) + init { - val filter = IntentFilter(ACTION_CANCEL_QUEUE) - LocalBroadcastManager.getInstance(service).registerReceiver(cancelReceiver, filter) + cancelChannel.receiveAsFlow() + .onEach(::cancelQueue) + .launchIn(scope) } companion object { - private const val ACTION_CANCEL_QUEUE = "Installer.action.CANCEL_QUEUE" - private const val EXTRA_DOWNLOAD_ID = "Installer.extra.DOWNLOAD_ID" + private val cancelChannel = Channel(Channel.UNLIMITED) /** * Attempts to cancel the installation entry for the provided download ID. * * @param downloadId Download ID as known by [ExtensionManager] */ - fun cancelInstallQueue(context: Context, downloadId: Long) { - val intent = Intent(ACTION_CANCEL_QUEUE) - intent.putExtra(EXTRA_DOWNLOAD_ID, downloadId) - LocalBroadcastManager.getInstance(context).sendBroadcast(intent) + suspend fun cancelInstallQueue(downloadId: Long) { + cancelChannel.send(downloadId) } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt index 5eae3fe47..544c555e6 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstaller.kt @@ -140,8 +140,10 @@ internal class ExtensionInstaller( * Cancels extension install and remove from download manager and installer. */ fun cancelInstall(pkgName: String) { - activeJobs.remove(pkgName)?.cancel() - Installer.cancelInstallQueue(context, pkgName.hashCode().toLong()) + scope.launch { + activeJobs.remove(pkgName)?.cancel() + Installer.cancelInstallQueue(pkgName.hashCode().toLong()) + } } /**