diff options
| author | 2024-05-06 14:59:31 -0700 | |
|---|---|---|
| committer | 2024-05-06 16:31:26 -0700 | |
| commit | 6ecaf7099a057eb3d3065d9a51a9322400b67aed (patch) | |
| tree | 79bbb7282f5d68c5efa04524e72174f405bcc30c | |
| parent | 1bd1cca9fb6747b03d35d5f581ad85b479407275 (diff) | |
Cleanup CL to prepare for single user-confirmation dialog change
This CL attempts to cleanup the code in PIA, to fix potential animation
glitches and smoothens the install flow, visually
Bug: 319320680
Test: Manual. Install an APK and check for visual glitches
Change-Id: Ie571193d2028ae0a7298eb148a4a986c3b52c4aa
5 files changed, 59 insertions, 33 deletions
diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java index eef21991b845..c96644ca8920 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java @@ -23,23 +23,23 @@ import android.app.DialogFragment; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.ApplicationInfo; import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; -import android.net.Uri; import android.os.Bundle; import android.util.Log; import android.view.View; - import androidx.annotation.Nullable; /** * Installation failed: Return status code to the caller or display failure UI to user */ public class InstallFailed extends Activity { + private static final String LOG_TAG = InstallFailed.class.getSimpleName(); - /** Label of the app that failed to install */ + /** + * Label of the app that failed to install + */ private CharSequence mLabel; private AlertDialog mDialog; @@ -80,29 +80,29 @@ public class InstallFailed extends Activity { setFinishOnTouchOutside(true); - int statusCode = getIntent().getIntExtra(PackageInstaller.EXTRA_STATUS, - PackageInstaller.STATUS_FAILURE); + Intent intent = getIntent(); + int statusCode = intent.getIntExtra(PackageInstaller.EXTRA_STATUS, + PackageInstaller.STATUS_FAILURE); + boolean returnResult = intent.getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false); - if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) { - int legacyStatus = getIntent().getIntExtra(PackageInstaller.EXTRA_LEGACY_STATUS, - PackageManager.INSTALL_FAILED_INTERNAL_ERROR); + if (returnResult) { + int legacyStatus = intent.getIntExtra(PackageInstaller.EXTRA_LEGACY_STATUS, + PackageManager.INSTALL_FAILED_INTERNAL_ERROR); // Return result if requested Intent result = new Intent(); result.putExtra(Intent.EXTRA_INSTALL_RESULT, legacyStatus); setResult(Activity.RESULT_FIRST_USER, result); finish(); - } else { - Intent intent = getIntent(); - ApplicationInfo appInfo = intent - .getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO); - Uri packageURI = intent.getData(); + } else if (statusCode != PackageInstaller.STATUS_FAILURE_ABORTED) { + // statusCode will be STATUS_FAILURE_ABORTED if the update-owner confirmation dialog was + // dismissed by the user. We don't want to show a InstallFailed dialog in this case. + // If the user denies install permission for normal installs, this dialog will never be + // triggered as the status code is returned from PackageInstallerActivity.java // Set header icon and title - PackageUtil.AppSnippet as; - PackageManager pm = getPackageManager(); - as = intent.getParcelableExtra(PackageInstallerActivity.EXTRA_APP_SNIPPET, - PackageUtil.AppSnippet.class); + PackageUtil.AppSnippet as = intent.getParcelableExtra( + PackageInstallerActivity.EXTRA_APP_SNIPPET, PackageUtil.AppSnippet.class); // Store label for dialog mLabel = as.label; @@ -127,6 +127,8 @@ public class InstallFailed extends Activity { // Get status messages setExplanationFromErrorCode(statusCode); + } else { + finish(); } } @@ -135,6 +137,7 @@ public class InstallFailed extends Activity { * "manage applications" settings page. */ public static class OutOfSpaceDialog extends DialogFragment { + private InstallFailed mActivity; @Override @@ -147,16 +150,16 @@ public class InstallFailed extends Activity { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(mActivity) - .setTitle(R.string.out_of_space_dlg_title) - .setMessage(getString(R.string.out_of_space_dlg_text, mActivity.mLabel)) - .setPositiveButton(R.string.manage_applications, (dialog, which) -> { - // launch manage applications - Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE"); - startActivity(intent); - mActivity.finish(); - }) - .setNegativeButton(R.string.cancel, (dialog, which) -> mActivity.finish()) - .create(); + .setTitle(R.string.out_of_space_dlg_title) + .setMessage(getString(R.string.out_of_space_dlg_text, mActivity.mLabel)) + .setPositiveButton(R.string.manage_applications, (dialog, which) -> { + // launch manage applications + Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE"); + startActivity(intent); + mActivity.finish(); + }) + .setNegativeButton(R.string.cancel, (dialog, which) -> mActivity.finish()) + .create(); } @Override diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java index 1a6c2bb2ec18..59a511db5b3a 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java @@ -30,6 +30,8 @@ import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; import android.util.Log; import android.view.View; import android.widget.Button; @@ -91,8 +93,11 @@ public class InstallInstalling extends Activity { // ContentResolver.SCHEME_FILE // STAGED_SESSION_ID extra contains an ID of a previously staged install session. final File sourceFile = new File(mPackageURI.getPath()); - PackageUtil.AppSnippet as = getIntent() - .getParcelableExtra(EXTRA_APP_SNIPPET, PackageUtil.AppSnippet.class); + + // Dialogs displayed while changing update-owner have a blank icon. To fix this, + // fetch the appSnippet from the source file again + PackageUtil.AppSnippet as = PackageUtil.getAppSnippet(this, appInfo, sourceFile); + getIntent().putExtra(EXTRA_APP_SNIPPET, as); AlertDialog.Builder builder = new AlertDialog.Builder(this); @@ -244,6 +249,14 @@ public class InstallInstalling extends Activity { super.onDestroy(); } + @Override + public void finish() { + if (mDialog != null) { + mDialog.dismiss(); + } + super.finish(); + } + /** * Launch the appropriate finish activity (success or failed) for the installation result. * @@ -299,7 +312,11 @@ public class InstallInstalling extends Activity { PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_MUTABLE); try { - session.commit(pendingIntent.getIntentSender()); + // Delay committing the session by 100ms to fix a UI glitch while displaying the + // Update-Owner change dialog on top of the Installing dialog + new Handler(Looper.getMainLooper()).postDelayed(() -> { + session.commit(pendingIntent.getIntentSender()); + }, 100); } catch (Exception e) { Log.e(LOG_TAG, "Cannot install package: ", e); launchFailure(PackageInstaller.STATUS_FAILURE, diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java index cf2f85ed5356..13251d8da109 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java @@ -165,7 +165,9 @@ public class InstallStaging extends Activity { if (mStagingTask != null) { mStagingTask.cancel(true); } - + if (mDialog != null) { + mDialog.dismiss(); + } super.onDestroy(); } diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java index a4c6ac7d95c7..3fea5996e3ef 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStart.java @@ -193,6 +193,7 @@ public class InstallStart extends Activity { if (isSessionInstall) { nextActivity.setClass(this, PackageInstallerActivity.class); + nextActivity.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); } else { Uri packageUri = intent.getData(); diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java index 8bed945af32c..774376c40807 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -465,10 +465,13 @@ public class PackageInstallerActivity extends Activity { @Override protected void onDestroy() { - super.onDestroy(); while (!mActiveUnknownSourcesListeners.isEmpty()) { unregister(mActiveUnknownSourcesListeners.get(0)); } + if (mDialog != null) { + mDialog.dismiss(); + } + super.onDestroy(); } private void bindUi() { |