diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 58fea94f0b..a1b389441b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -174,11 +174,6 @@ - - @@ -200,6 +195,10 @@ android:name=".data.notification.NotificationReceiver" android:exported="false" /> + + diff --git a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallBroadcast.kt similarity index 77% rename from app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt rename to app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallBroadcast.kt index 8d081dd37c..4edefea06b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/extension/util/ExtensionInstallBroadcast.kt @@ -1,15 +1,14 @@ package eu.kanade.tachiyomi.extension.util -import android.app.Activity import android.app.DownloadManager import android.app.PendingIntent +import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller.SessionParams import android.content.pm.PackageInstaller.SessionParams.USER_ACTION_NOT_REQUIRED import android.os.Build -import android.os.Bundle import android.widget.Toast import com.hippo.unifile.UniFile import eu.kanade.tachiyomi.R @@ -22,19 +21,17 @@ import uy.kohesive.injekt.injectLazy * Activity used to install extensions, because we can only receive the result of the installation * with [startActivityForResult], which we need to update the UI. */ -class ExtensionInstallActivity : Activity() { - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) +class ExtensionInstallBroadcast : BroadcastReceiver() { + override fun onReceive(context: Context, intent: Intent) { try { if (PACKAGE_INSTALLED_ACTION == intent.action) { - packageInstallStep(intent) + packageInstallStep(context, intent) return } val downloadId = intent.extras!!.getLong(ExtensionInstaller.EXTRA_DOWNLOAD_ID) - val packageInstaller = packageManager.packageInstaller - val data = UniFile.fromUri(this, intent.data).openInputStream() + val packageInstaller = context.packageManager.packageInstaller + val data = UniFile.fromUri(context, intent.data).openInputStream() val params = SessionParams( SessionParams.MODE_FULL_INSTALL @@ -48,29 +45,28 @@ class ExtensionInstallActivity : Activity() { data.copyTo(packageInSession) } - val newIntent = Intent(this, ExtensionInstallActivity::class.java) + val newIntent = Intent(context, ExtensionInstallBroadcast::class.java) .setAction(PACKAGE_INSTALLED_ACTION) .putExtra(ExtensionInstaller.EXTRA_DOWNLOAD_ID, downloadId) .putExtra(EXTRA_SESSION_ID, sessionId) - val pendingIntent = PendingIntent.getActivity(this, downloadId.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT) + val pendingIntent = PendingIntent.getBroadcast(context, downloadId.hashCode(), newIntent, PendingIntent.FLAG_UPDATE_CURRENT) val statusReceiver = pendingIntent.intentSender session.commit(statusReceiver) val extensionManager: ExtensionManager by injectLazy() extensionManager.setInstalling(downloadId, sessionId) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - (getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).remove(downloadId) + (context.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager).remove(downloadId) } data.close() } catch (error: Exception) { // Either install package can't be found (probably bots) or there's a security exception // with the download manager. Nothing we can workaround. - toast(error.message) + context.toast(error.message) } - finish() } - private fun packageInstallStep(intent: Intent) { + private fun packageInstallStep(context: Context, intent: Intent) { val extras = intent.extras ?: return if (PACKAGE_INSTALLED_ACTION == intent.action) { val downloadId = extras.getLong(ExtensionInstaller.EXTRA_DOWNLOAD_ID) @@ -78,27 +74,23 @@ class ExtensionInstallActivity : Activity() { when (val status = extras.getInt(PackageInstaller.EXTRA_STATUS)) { PackageInstaller.STATUS_PENDING_USER_ACTION -> { val confirmIntent = extras[Intent.EXTRA_INTENT] as? Intent - startActivityForResult(confirmIntent, INSTALL_REQUEST_CODE) - finish() + context.startActivity(confirmIntent?.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)) } PackageInstaller.STATUS_SUCCESS -> { extensionManager.setInstallationResult(downloadId, true) - finish() } PackageInstaller.STATUS_FAILURE, PackageInstaller.STATUS_FAILURE_ABORTED, PackageInstaller.STATUS_FAILURE_BLOCKED, PackageInstaller.STATUS_FAILURE_CONFLICT, PackageInstaller.STATUS_FAILURE_INCOMPATIBLE, PackageInstaller.STATUS_FAILURE_INVALID, PackageInstaller.STATUS_FAILURE_STORAGE -> { extensionManager.setInstallationResult(downloadId, false) if (status != PackageInstaller.STATUS_FAILURE_ABORTED) { if (MiuiUtil.isMiui()) { - toast(R.string.extensions_miui_warning, Toast.LENGTH_LONG) + context.toast(R.string.extensions_miui_warning, Toast.LENGTH_LONG) } else { - toast(R.string.could_not_install_extension) + context.toast(R.string.could_not_install_extension) } } - finish() } else -> { extensionManager.setInstallationResult(downloadId, false) - finish() } } } 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 937c5df728..6ee88927ee 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 @@ -211,12 +211,12 @@ internal class ExtensionInstaller(private val context: Context) { * @param uri The uri of the extension to install. */ fun installApk(downloadId: Long, uri: Uri) { - val intent = Intent(context, ExtensionInstallActivity::class.java) + val intent = Intent(context, ExtensionInstallBroadcast::class.java) .setDataAndType(uri, APK_MIME) .putExtra(EXTRA_DOWNLOAD_ID, downloadId) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_GRANT_READ_URI_PERMISSION) - context.startActivity(intent) + context.sendBroadcast(intent) } /**