Simplify install prompt handling

Reverts most changes to MainActivity and uses handleSpecialIntent
instead. handleSpecialIntent now defers installer prompt to
InstallerService by starting it again.

SpecialIntent has been modified to accommodate extra data needed to
handle these callbacks.
This commit is contained in:
Matthew Crossman 2022-01-03 14:51:31 +11:00
parent 73ac718ce2
commit 3e8e23e111
No known key found for this signature in database
GPG Key ID: C6B942B019794CC2
2 changed files with 25 additions and 41 deletions

View File

@ -1,15 +1,10 @@
package com.looker.droidify package com.looker.droidify
import android.app.PendingIntent
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller import android.content.pm.PackageInstaller
import android.net.Uri
import com.looker.droidify.ContextWrapperX.Companion.wrap import com.looker.droidify.ContextWrapperX.Companion.wrap
import com.looker.droidify.installer.InstallerService
import com.looker.droidify.screen.ScreenActivity import com.looker.droidify.screen.ScreenActivity
import com.looker.droidify.utility.extension.android.Android
import kotlinx.coroutines.withContext
class MainActivity : ScreenActivity() { class MainActivity : ScreenActivity() {
companion object { companion object {
@ -22,35 +17,13 @@ class MainActivity : ScreenActivity() {
override fun handleIntent(intent: Intent?) { override fun handleIntent(intent: Intent?) {
when (intent?.action) { when (intent?.action) {
ACTION_UPDATES -> handleSpecialIntent(SpecialIntent.Updates) ACTION_UPDATES -> handleSpecialIntent(SpecialIntent.Updates)
ACTION_INSTALL -> { ACTION_INSTALL -> handleSpecialIntent(
// continue install prompt SpecialIntent.Install(
val promptIntent: Intent? = intent.getParcelableExtra(Intent.EXTRA_INTENT) intent.packageName,
intent.getIntExtra(PackageInstaller.EXTRA_STATUS, -1),
promptIntent?.let { intent.getParcelableExtra(Intent.EXTRA_INTENT)
it.putExtra(Intent.EXTRA_NOT_UNKNOWN_SOURCE, true) )
it.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, BuildConfig.APPLICATION_ID) )
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK )
startActivity(it)
}
// TODO: send this back to the InstallerService to free up the UI
// prepare prompt intent
// val name = intent.getStringExtra(PackageInstaller.EXTRA_PACKAGE_NAME)
//
// val pending = PendingIntent.getService(
// this,
// 0,
// Intent(this, InstallerService::class.java)
// .setData(Uri.parse("package:$name"))
// .putExtra(Intent.EXTRA_INTENT, promptIntent)
// .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK),
// if (Android.sdk(23)) PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
// else PendingIntent.FLAG_UPDATE_CURRENT
// )
//
// pending.send()
}
else -> super.handleIntent(intent) else -> super.handleIntent(intent)
} }
} }

View File

@ -1,6 +1,7 @@
package com.looker.droidify.screen package com.looker.droidify.screen
import android.content.Intent import android.content.Intent
import android.content.pm.PackageInstaller
import android.os.Bundle import android.os.Bundle
import android.os.Parcel import android.os.Parcel
import android.view.ViewGroup import android.view.ViewGroup
@ -13,7 +14,7 @@ import com.google.android.material.circularreveal.CircularRevealFrameLayout
import com.looker.droidify.R import com.looker.droidify.R
import com.looker.droidify.content.Preferences import com.looker.droidify.content.Preferences
import com.looker.droidify.database.CursorOwner import com.looker.droidify.database.CursorOwner
import com.looker.droidify.installer.AppInstaller import com.looker.droidify.installer.InstallerService
import com.looker.droidify.ui.fragments.AppDetailFragment import com.looker.droidify.ui.fragments.AppDetailFragment
import com.looker.droidify.utility.KParcelable import com.looker.droidify.utility.KParcelable
import com.looker.droidify.utility.extension.resources.getDrawableFromAttr import com.looker.droidify.utility.extension.resources.getDrawableFromAttr
@ -27,7 +28,7 @@ abstract class ScreenActivity : AppCompatActivity() {
sealed class SpecialIntent { sealed class SpecialIntent {
object Updates : SpecialIntent() object Updates : SpecialIntent()
class Install(val packageName: String?, val cacheFileName: String?) : SpecialIntent() class Install(val packageName: String?, val status: Int?, val promptIntent: Intent?) : SpecialIntent()
} }
private class FragmentStackItem( private class FragmentStackItem(
@ -217,14 +218,24 @@ abstract class ScreenActivity : AppCompatActivity() {
} }
is SpecialIntent.Install -> { is SpecialIntent.Install -> {
val packageName = specialIntent.packageName val packageName = specialIntent.packageName
if (!packageName.isNullOrEmpty()) { val status = specialIntent.status
val promptIntent = specialIntent.promptIntent
if (!packageName.isNullOrEmpty() && status != null && promptIntent != null) {
lifecycleScope.launch { lifecycleScope.launch {
specialIntent.cacheFileName?.let { startService(
AppInstaller.getInstance(this@ScreenActivity) Intent(baseContext, InstallerService::class.java)
?.defaultInstaller?.install(packageName, it) .putExtra(PackageInstaller.EXTRA_STATUS, status)
} .putExtra(
PackageInstaller.EXTRA_PACKAGE_NAME,
packageName
)
.putExtra(Intent.EXTRA_INTENT, promptIntent)
)
} }
} }
else {
throw IllegalArgumentException("Missing parameters needed to relaunch InstallerService and trigger prompt.")
}
Unit Unit
} }
}::class }::class