diff options
7 files changed, 111 insertions, 57 deletions
diff --git a/packages/PackageInstaller/AndroidManifest.xml b/packages/PackageInstaller/AndroidManifest.xml index a16f9f55b466..3065362ce840 100644 --- a/packages/PackageInstaller/AndroidManifest.xml +++ b/packages/PackageInstaller/AndroidManifest.xml @@ -81,6 +81,7 @@ android:exported="false" /> <activity android:name=".PackageInstallerActivity" + android:theme="@style/Theme.AlertDialogActivity.NoAnimation" android:exported="false" /> <activity android:name=".InstallInstalling" diff --git a/packages/PackageInstaller/res/values/themes.xml b/packages/PackageInstaller/res/values/themes.xml index aa1fa164b021..811fa7380c48 100644 --- a/packages/PackageInstaller/res/values/themes.xml +++ b/packages/PackageInstaller/res/values/themes.xml @@ -32,8 +32,8 @@ <item name="android:windowNoTitle">true</item> </style> - <style name="Theme.AlertDialogActivity.NoDim"> - <item name="android:windowNoTitle">true</item> + <style name="Theme.AlertDialogActivity.NoDim" + parent="@style/Theme.AlertDialogActivity.NoActionBar"> <item name="android:backgroundDimAmount">0</item> </style> diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java index 74f04e093162..eef21991b845 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallFailed.java @@ -36,12 +36,14 @@ import androidx.annotation.Nullable; /** * Installation failed: Return status code to the caller or display failure UI to user */ -public class InstallFailed extends AlertActivity { +public class InstallFailed extends Activity { private static final String LOG_TAG = InstallFailed.class.getSimpleName(); /** Label of the app that failed to install */ private CharSequence mLabel; + private AlertDialog mDialog; + /** * Unhide the appropriate label for the statusCode. * @@ -53,19 +55,19 @@ public class InstallFailed extends AlertActivity { View viewToEnable; switch (statusCode) { case PackageInstaller.STATUS_FAILURE_BLOCKED: - viewToEnable = requireViewById(R.id.install_failed_blocked); + viewToEnable = mDialog.requireViewById(R.id.install_failed_blocked); break; case PackageInstaller.STATUS_FAILURE_CONFLICT: - viewToEnable = requireViewById(R.id.install_failed_conflict); + viewToEnable = mDialog.requireViewById(R.id.install_failed_conflict); break; case PackageInstaller.STATUS_FAILURE_INCOMPATIBLE: - viewToEnable = requireViewById(R.id.install_failed_incompatible); + viewToEnable = mDialog.requireViewById(R.id.install_failed_incompatible); break; case PackageInstaller.STATUS_FAILURE_INVALID: - viewToEnable = requireViewById(R.id.install_failed_invalid_apk); + viewToEnable = mDialog.requireViewById(R.id.install_failed_invalid_apk); break; default: - viewToEnable = requireViewById(R.id.install_failed); + viewToEnable = mDialog.requireViewById(R.id.install_failed); break; } @@ -105,12 +107,18 @@ public class InstallFailed extends AlertActivity { // Store label for dialog mLabel = as.label; - mAlert.setIcon(as.icon); - mAlert.setTitle(as.label); - mAlert.setView(R.layout.install_content_view); - mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.done), - (ignored, ignored2) -> finish(), null); - setupAlert(); + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(as.icon); + builder.setTitle(as.label); + builder.setView(R.layout.install_content_view); + builder.setPositiveButton(getString(R.string.done), + (ignored, ignored2) -> finish()); + builder.setOnCancelListener(dialog -> { + finish(); + }); + mDialog = builder.create(); + mDialog.show(); // Show out of space dialog if needed if (statusCode == PackageInstaller.STATUS_FAILURE_STORAGE) { diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java index 4992ef1e1c00..8d8254ad4058 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallInstalling.java @@ -19,6 +19,8 @@ package com.android.packageinstaller; import static com.android.packageinstaller.PackageInstallerActivity.EXTRA_APP_SNIPPET; import static com.android.packageinstaller.PackageInstallerActivity.EXTRA_STAGED_SESSION_ID; +import android.app.Activity; +import android.app.AlertDialog; import android.app.PendingIntent; import android.content.DialogInterface; import android.content.Intent; @@ -43,7 +45,7 @@ import java.io.IOException; * <p>This has two phases: First send the data to the package manager, then wait until the package * manager processed the result.</p> */ -public class InstallInstalling extends AlertActivity { +public class InstallInstalling extends Activity { private static final String LOG_TAG = InstallInstalling.class.getSimpleName(); private static final String SESSION_ID = "com.android.packageinstaller.SESSION_ID"; @@ -67,6 +69,8 @@ public class InstallInstalling extends AlertActivity { /** The button that can cancel this dialog */ private Button mCancelButton; + private AlertDialog mDialog; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -90,10 +94,12 @@ public class InstallInstalling extends AlertActivity { PackageUtil.AppSnippet as = getIntent() .getParcelableExtra(EXTRA_APP_SNIPPET, PackageUtil.AppSnippet.class); - mAlert.setIcon(as.icon); - mAlert.setTitle(as.label); - mAlert.setView(R.layout.install_content_view); - mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(as.icon); + builder.setTitle(as.label); + builder.setView(R.layout.install_content_view); + builder.setNegativeButton(getString(R.string.cancel), (ignored, ignored2) -> { if (mInstallingTask != null) { mInstallingTask.cancel(true); @@ -106,9 +112,11 @@ public class InstallInstalling extends AlertActivity { setResult(RESULT_CANCELED); finish(); - }, null); - setupAlert(); - requireViewById(R.id.installing).setVisibility(View.VISIBLE); + }); + builder.setCancelable(false); + mDialog = builder.create(); + mDialog.show(); + mDialog.requireViewById(R.id.installing).setVisibility(View.VISIBLE); if (savedInstanceState != null) { mSessionId = savedInstanceState.getInt(SESSION_ID); @@ -145,7 +153,7 @@ public class InstallInstalling extends AlertActivity { } } - mCancelButton = mAlert.getButton(DialogInterface.BUTTON_NEGATIVE); + mCancelButton = mDialog.getButton(DialogInterface.BUTTON_NEGATIVE); } } diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java index 483fb8c451ae..cf2f85ed5356 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallStaging.java @@ -52,7 +52,7 @@ import java.io.OutputStream; * If a package gets installed from a content URI this step stages the installation session * reading bytes from the URI. */ -public class InstallStaging extends AlertActivity { +public class InstallStaging extends Activity { private static final String LOG_TAG = InstallStaging.class.getSimpleName(); private static final String STAGED_SESSION_ID = "STAGED_SESSION_ID"; @@ -65,6 +65,8 @@ public class InstallStaging extends AlertActivity { /** The session the package is in */ private int mStagedSessionId; + private AlertDialog mDialog; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -72,10 +74,13 @@ public class InstallStaging extends AlertActivity { mInstaller = getPackageManager().getPackageInstaller(); setFinishOnTouchOutside(true); - mAlert.setIcon(R.drawable.ic_file_download); - mAlert.setTitle(getString(R.string.app_name_unknown)); - mAlert.setView(R.layout.install_content_view); - mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), + + AlertDialog.Builder builder = new AlertDialog.Builder(this); + + builder.setIcon(R.drawable.ic_file_download); + builder.setTitle(getString(R.string.app_name_unknown)); + builder.setView(R.layout.install_content_view); + builder.setNegativeButton(getString(R.string.cancel), (ignored, ignored2) -> { if (mStagingTask != null) { mStagingTask.cancel(true); @@ -85,9 +90,21 @@ public class InstallStaging extends AlertActivity { setResult(RESULT_CANCELED); finish(); - }, null); - setupAlert(); - requireViewById(R.id.staging).setVisibility(View.VISIBLE); + }); + builder.setOnCancelListener(dialog -> { + if (mStagingTask != null) { + mStagingTask.cancel(true); + } + + cleanupStagingSession(); + + setResult(RESULT_CANCELED); + finish(); + }); + mDialog = builder.create(); + mDialog.show(); + mDialog.requireViewById(com.android.packageinstaller.R.id.staging) + .setVisibility(View.VISIBLE); if (savedInstanceState != null) { mStagedSessionId = savedInstanceState.getInt(STAGED_SESSION_ID, 0); @@ -275,8 +292,9 @@ public class InstallStaging extends AlertActivity { @Override protected void onPreExecute() { final long sizeBytes = getContentSizeBytes(); - - mProgressBar = sizeBytes > 0 ? requireViewById(R.id.progress_indeterminate) : null; + if (sizeBytes > 0 && mDialog != null) { + mProgressBar = mDialog.requireViewById(R.id.progress_indeterminate); + } if (mProgressBar != null) { mProgressBar.setProgress(0); mProgressBar.setMax(100); diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java index fbc9525d4615..9af88c3b4694 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/InstallSuccess.java @@ -17,6 +17,7 @@ package com.android.packageinstaller; import android.app.Activity; +import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.ApplicationInfo; @@ -34,7 +35,7 @@ import java.util.List; /** * Finish installation: Return status code to the caller or display "success" UI to user */ -public class InstallSuccess extends AlertActivity { +public class InstallSuccess extends Activity { private static final String LOG_TAG = InstallSuccess.class.getSimpleName(); @Nullable @@ -46,6 +47,8 @@ public class InstallSuccess extends AlertActivity { @Nullable private Intent mLaunchIntent; + private AlertDialog mDialog; + @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -83,20 +86,27 @@ public class InstallSuccess extends AlertActivity { return; } - mAlert.setIcon(mAppSnippet.icon); - mAlert.setTitle(mAppSnippet.label); - mAlert.setView(R.layout.install_content_view); - mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.launch), null, - null); - mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.done), + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setIcon(mAppSnippet.icon); + builder.setTitle(mAppSnippet.label); + builder.setView(R.layout.install_content_view); + builder.setPositiveButton(getString(R.string.launch), null); + builder.setNegativeButton(getString(R.string.done), (ignored, ignored2) -> { if (mAppPackageName != null) { Log.i(LOG_TAG, "Finished installing " + mAppPackageName); } finish(); - }, null); - setupAlert(); - requireViewById(R.id.install_success).setVisibility(View.VISIBLE); + }); + builder.setOnCancelListener(dialog -> { + if (mAppPackageName != null) { + Log.i(LOG_TAG, "Finished installing " + mAppPackageName); + } + finish(); + }); + mDialog = builder.create(); + mDialog.show(); + mDialog.requireViewById(R.id.install_success).setVisibility(View.VISIBLE); // Enable or disable "launch" button boolean enabled = false; if (mLaunchIntent != null) { @@ -107,7 +117,7 @@ public class InstallSuccess extends AlertActivity { } } - Button launchButton = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); + Button launchButton = mDialog.getButton(DialogInterface.BUTTON_POSITIVE); if (enabled) { launchButton.setOnClickListener(view -> { setResult(Activity.RESULT_OK, mLaunchIntent); diff --git a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java index c5ae4a37b355..ceb580d170d0 100644 --- a/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/packages/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -71,7 +71,7 @@ import java.util.List; * Based on the user response the package is then installed by launching InstallAppConfirm * sub activity. All state transitions are handled in this activity */ -public class PackageInstallerActivity extends AlertActivity { +public class PackageInstallerActivity extends Activity { private static final String TAG = "PackageInstaller"; private static final int REQUEST_TRUST_EXTERNAL_SOURCE = 1; @@ -135,11 +135,13 @@ public class PackageInstallerActivity extends AlertActivity { // Would the mOk button be enabled if this activity would be resumed private boolean mEnableOk = false; + private AlertDialog mDialog; + private void startInstallConfirm() { TextView viewToEnable; if (mAppInfo != null) { - viewToEnable = requireViewById(R.id.install_confirm_question_update); + viewToEnable = mDialog.requireViewById(R.id.install_confirm_question_update); final CharSequence existingUpdateOwnerLabel = getExistingUpdateOwnerLabel(); final CharSequence requestedUpdateOwnerLabel = getApplicationLabel(mCallingPackage); @@ -157,7 +159,7 @@ public class PackageInstallerActivity extends AlertActivity { } } else { // This is a new application with no permissions. - viewToEnable = requireViewById(R.id.install_confirm_question); + viewToEnable = mDialog.requireViewById(R.id.install_confirm_question); } viewToEnable.setVisibility(View.VISIBLE); @@ -480,10 +482,11 @@ public class PackageInstallerActivity extends AlertActivity { } private void bindUi() { - mAlert.setIcon(mAppSnippet.icon); - mAlert.setTitle(mAppSnippet.label); - mAlert.setView(R.layout.install_content_view); - mAlert.setButton(DialogInterface.BUTTON_POSITIVE, getString(R.string.install), + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setIcon(mAppSnippet.icon); + builder.setTitle(mAppSnippet.label); + builder.setView(R.layout.install_content_view); + builder.setPositiveButton(getString(R.string.install), (ignored, ignored2) -> { if (mOk.isEnabled()) { if (mSessionId != -1) { @@ -493,20 +496,26 @@ public class PackageInstallerActivity extends AlertActivity { startInstall(); } } - }, null); - mAlert.setButton(DialogInterface.BUTTON_NEGATIVE, getString(R.string.cancel), + }); + builder.setNegativeButton(getString(R.string.cancel), (ignored, ignored2) -> { // Cancel and finish setActivityResult(RESULT_CANCELED); finish(); - }, null); - setupAlert(); + }); + builder.setOnCancelListener(dialog -> { + // Cancel and finish + setActivityResult(RESULT_CANCELED); + finish(); + }); + mDialog = builder.create(); + mDialog.show(); - mOk = mAlert.getButton(DialogInterface.BUTTON_POSITIVE); + mOk = mDialog.getButton(DialogInterface.BUTTON_POSITIVE); mOk.setEnabled(false); if (!mOk.isInTouchMode()) { - mAlert.getButton(DialogInterface.BUTTON_NEGATIVE).requestFocus(); + mDialog.getButton(DialogInterface.BUTTON_NEGATIVE).requestFocus(); } } |