mirror of
https://github.com/tachiyomiorg/tachiyomi.git
synced 2024-12-23 10:41:48 +01:00
Switching extension install activity to broadcast
so updating from a notification does not open the app anymore
This commit is contained in:
parent
e185422c9f
commit
ccd08f7bdc
@ -174,11 +174,6 @@
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<activity
|
||||
android:name=".extension.util.ExtensionInstallActivity"
|
||||
android:icon="@mipmap/ic_launcher"
|
||||
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
|
||||
|
||||
<activity
|
||||
android:name="com.google.android.gms.oss.licenses.OssLicensesMenuActivity"
|
||||
android:theme="@style/Theme.OSS" />
|
||||
@ -200,6 +195,10 @@
|
||||
android:name=".data.notification.NotificationReceiver"
|
||||
android:exported="false" />
|
||||
|
||||
<receiver
|
||||
android:name=".extension.util.ExtensionInstallBroadcast"
|
||||
android:exported="false" />
|
||||
|
||||
<receiver
|
||||
android:name=".data.updater.UpdaterBroadcast"
|
||||
android:exported="false">
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
}
|
@ -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)
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user