Loading packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt +28 −4 Original line number Diff line number Diff line Loading @@ -912,8 +912,10 @@ class InstallRepository(private val context: Context) { "message: $message" ) } if (statusCode == PackageInstaller.STATUS_SUCCESS) { val shouldReturnResult = intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false) if (statusCode == PackageInstaller.STATUS_SUCCESS) { val resultIntent = if (shouldReturnResult) { Intent().putExtra(Intent.EXTRA_INSTALL_RESULT, PackageManager.INSTALL_SUCCEEDED) } else { Loading @@ -922,12 +924,34 @@ class InstallRepository(private val context: Context) { } _installResult.setValue(InstallSuccess(appSnippet, shouldReturnResult, resultIntent)) } else { if (statusCode != PackageInstaller.STATUS_FAILURE_ABORTED) { // TODO (b/346655018): Use INSTALL_FAILED_ABORTED legacyCode in the condition // statusCode can be STATUS_FAILURE_ABORTED if: // 1. GPP blocks an install. // 2. User denies ownership update explicitly. // InstallFailed dialog must not be shown only when the user denies ownership update. We // must show this dialog for all other install failures. val userDenied = statusCode == PackageInstaller.STATUS_FAILURE_ABORTED && legacyStatus != PackageManager.INSTALL_FAILED_VERIFICATION_TIMEOUT && legacyStatus != PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE if (shouldReturnResult) { val resultIntent = Intent().putExtra(Intent.EXTRA_INSTALL_RESULT, legacyStatus) _installResult.setValue( InstallFailed(appSnippet, statusCode, legacyStatus, message) InstallFailed( legacyCode = legacyStatus, statusCode = statusCode, shouldReturnResult = true, resultIntent = resultIntent ) } else { ) } else if (userDenied) { _installResult.setValue(InstallAborted(ABORT_REASON_INTERNAL_ERROR)) } else { _installResult.setValue( InstallFailed(appSnippet, legacyStatus, statusCode, message) ) } } } Loading packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallStages.kt +14 −8 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.packageinstaller.v2.model import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.content.pm.PackageInstaller import android.graphics.drawable.Drawable sealed class InstallStage(val stageCode: Int) { Loading Loading @@ -77,11 +78,10 @@ data class InstallSuccess( val shouldReturnResult: Boolean = false, /** * * * If the caller is requesting a result back, this will hold the Intent with * [Intent.EXTRA_INSTALL_RESULT] set to [PackageManager.INSTALL_SUCCEEDED] which is sent * back to the caller. * * If the caller is requesting a result back, this will hold an Intent with * [Intent.EXTRA_INSTALL_RESULT] set to [PackageManager.INSTALL_SUCCEEDED]. * * * If the caller doesn't want the result back, this will hold the Intent that launches * * If the caller doesn't want the result back, this will hold an Intent that launches * the newly installed / updated app if a launchable activity exists. */ val resultIntent: Intent? = null, Loading @@ -95,17 +95,23 @@ data class InstallSuccess( } data class InstallFailed( private val appSnippet: PackageUtil.AppSnippet, private val appSnippet: PackageUtil.AppSnippet? = null, val legacyCode: Int, val statusCode: Int, val message: String?, val message: String? = null, val shouldReturnResult: Boolean = false, /** * If the caller is requesting a result back, this will hold an Intent with * [Intent.EXTRA_INSTALL_RESULT] set to the [PackageInstaller.EXTRA_LEGACY_STATUS]. */ val resultIntent: Intent? = null ) : InstallStage(STAGE_FAILED) { val appIcon: Drawable? get() = appSnippet.icon get() = appSnippet?.icon val appLabel: String? get() = appSnippet.label as String? get() = appSnippet?.label as String? } data class InstallAborted( Loading packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt +9 −4 Original line number Diff line number Diff line Loading @@ -171,15 +171,20 @@ class InstallLaunch : FragmentActivity(), InstallActionListener { val successIntent = success.resultIntent setResult(Activity.RESULT_OK, successIntent, true) } else { val successFragment = InstallSuccessFragment(success) showDialogInner(successFragment) val successDialog = InstallSuccessFragment(success) showDialogInner(successDialog) } } InstallStage.STAGE_FAILED -> { val failed = installStage as InstallFailed val failedDialog = InstallFailedFragment(failed) showDialogInner(failedDialog) if (failed.shouldReturnResult) { val failureIntent = failed.resultIntent setResult(Activity.RESULT_FIRST_USER, failureIntent, true) } else { val failureDialog = InstallFailedFragment(failed) showDialogInner(failureDialog) } } else -> { Loading Loading
packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallRepository.kt +28 −4 Original line number Diff line number Diff line Loading @@ -912,8 +912,10 @@ class InstallRepository(private val context: Context) { "message: $message" ) } if (statusCode == PackageInstaller.STATUS_SUCCESS) { val shouldReturnResult = intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false) if (statusCode == PackageInstaller.STATUS_SUCCESS) { val resultIntent = if (shouldReturnResult) { Intent().putExtra(Intent.EXTRA_INSTALL_RESULT, PackageManager.INSTALL_SUCCEEDED) } else { Loading @@ -922,12 +924,34 @@ class InstallRepository(private val context: Context) { } _installResult.setValue(InstallSuccess(appSnippet, shouldReturnResult, resultIntent)) } else { if (statusCode != PackageInstaller.STATUS_FAILURE_ABORTED) { // TODO (b/346655018): Use INSTALL_FAILED_ABORTED legacyCode in the condition // statusCode can be STATUS_FAILURE_ABORTED if: // 1. GPP blocks an install. // 2. User denies ownership update explicitly. // InstallFailed dialog must not be shown only when the user denies ownership update. We // must show this dialog for all other install failures. val userDenied = statusCode == PackageInstaller.STATUS_FAILURE_ABORTED && legacyStatus != PackageManager.INSTALL_FAILED_VERIFICATION_TIMEOUT && legacyStatus != PackageManager.INSTALL_FAILED_VERIFICATION_FAILURE if (shouldReturnResult) { val resultIntent = Intent().putExtra(Intent.EXTRA_INSTALL_RESULT, legacyStatus) _installResult.setValue( InstallFailed(appSnippet, statusCode, legacyStatus, message) InstallFailed( legacyCode = legacyStatus, statusCode = statusCode, shouldReturnResult = true, resultIntent = resultIntent ) } else { ) } else if (userDenied) { _installResult.setValue(InstallAborted(ABORT_REASON_INTERNAL_ERROR)) } else { _installResult.setValue( InstallFailed(appSnippet, legacyStatus, statusCode, message) ) } } } Loading
packages/PackageInstaller/src/com/android/packageinstaller/v2/model/InstallStages.kt +14 −8 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.packageinstaller.v2.model import android.app.Activity import android.content.Intent import android.content.pm.PackageManager import android.content.pm.PackageInstaller import android.graphics.drawable.Drawable sealed class InstallStage(val stageCode: Int) { Loading Loading @@ -77,11 +78,10 @@ data class InstallSuccess( val shouldReturnResult: Boolean = false, /** * * * If the caller is requesting a result back, this will hold the Intent with * [Intent.EXTRA_INSTALL_RESULT] set to [PackageManager.INSTALL_SUCCEEDED] which is sent * back to the caller. * * If the caller is requesting a result back, this will hold an Intent with * [Intent.EXTRA_INSTALL_RESULT] set to [PackageManager.INSTALL_SUCCEEDED]. * * * If the caller doesn't want the result back, this will hold the Intent that launches * * If the caller doesn't want the result back, this will hold an Intent that launches * the newly installed / updated app if a launchable activity exists. */ val resultIntent: Intent? = null, Loading @@ -95,17 +95,23 @@ data class InstallSuccess( } data class InstallFailed( private val appSnippet: PackageUtil.AppSnippet, private val appSnippet: PackageUtil.AppSnippet? = null, val legacyCode: Int, val statusCode: Int, val message: String?, val message: String? = null, val shouldReturnResult: Boolean = false, /** * If the caller is requesting a result back, this will hold an Intent with * [Intent.EXTRA_INSTALL_RESULT] set to the [PackageInstaller.EXTRA_LEGACY_STATUS]. */ val resultIntent: Intent? = null ) : InstallStage(STAGE_FAILED) { val appIcon: Drawable? get() = appSnippet.icon get() = appSnippet?.icon val appLabel: String? get() = appSnippet.label as String? get() = appSnippet?.label as String? } data class InstallAborted( Loading
packages/PackageInstaller/src/com/android/packageinstaller/v2/ui/InstallLaunch.kt +9 −4 Original line number Diff line number Diff line Loading @@ -171,15 +171,20 @@ class InstallLaunch : FragmentActivity(), InstallActionListener { val successIntent = success.resultIntent setResult(Activity.RESULT_OK, successIntent, true) } else { val successFragment = InstallSuccessFragment(success) showDialogInner(successFragment) val successDialog = InstallSuccessFragment(success) showDialogInner(successDialog) } } InstallStage.STAGE_FAILED -> { val failed = installStage as InstallFailed val failedDialog = InstallFailedFragment(failed) showDialogInner(failedDialog) if (failed.shouldReturnResult) { val failureIntent = failed.resultIntent setResult(Activity.RESULT_FIRST_USER, failureIntent, true) } else { val failureDialog = InstallFailedFragment(failed) showDialogInner(failureDialog) } } else -> { Loading