From f63739bb3f5de9927171b84630ec5872ba85fa6c Mon Sep 17 00:00:00 2001 From: Svetoslav Ganov Date: Tue, 10 May 2016 10:55:26 -0700 Subject: Fix app install flow A regression was introduced when we added support for installing apps from content URIs. Since we stage the APK in the cache folder we changed the flow to wipe the cached version when the PackageInstallerActivity finishes or gets an installation result, so we started the InstallAppProgress activity for result but the latter may be called with the forward result flag which is incompatible with start activity for result. This change delegates clearing the staging file in the cache folder to the InstallAppProgress activity. bug:28551937 Change-Id: I0d9978aff60b7fab6b64fe7bf889ef30f9b2fd7c --- .../packageinstaller/InstallAppProgress.java | 29 +++++++++++++++++----- .../packageinstaller/PackageInstallerActivity.java | 5 ++-- 2 files changed, 25 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/com/android/packageinstaller/InstallAppProgress.java b/src/com/android/packageinstaller/InstallAppProgress.java index 38f53e53..e93c93c7 100755 --- a/src/com/android/packageinstaller/InstallAppProgress.java +++ b/src/com/android/packageinstaller/InstallAppProgress.java @@ -34,7 +34,6 @@ import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.ResolveInfo; -import android.graphics.drawable.LevelListDrawable; import android.net.Uri; import android.os.Bundle; import android.os.Handler; @@ -94,7 +93,7 @@ public class InstallAppProgress extends Activity implements View.OnClickListener setResult(msg.arg1 == PackageInstaller.STATUS_SUCCESS ? Activity.RESULT_OK : Activity.RESULT_FIRST_USER, result); - finish(); + clearCachedApkIfNeededAndFinish(); return; } // Update the status text @@ -206,6 +205,11 @@ public class InstallAppProgress extends Activity implements View.OnClickListener initView(); } + @Override + public void onBackPressed() { + clearCachedApkIfNeededAndFinish(); + } + @SuppressWarnings("deprecation") @Override public Dialog onCreateDialog(int id, Bundle bundle) { @@ -220,13 +224,13 @@ public class InstallAppProgress extends Activity implements View.OnClickListener //launch manage applications Intent intent = new Intent("android.intent.action.MANAGE_PACKAGE_STORAGE"); startActivity(intent); - finish(); + clearCachedApkIfNeededAndFinish(); } }) .setNegativeButton(R.string.cancel, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { Log.i(TAG, "Canceling installation"); - finish(); + clearCachedApkIfNeededAndFinish(); } }) .setOnCancelListener(this) @@ -370,14 +374,27 @@ public class InstallAppProgress extends Activity implements View.OnClickListener if (mAppInfo.packageName != null) { Log.i(TAG, "Finished installing "+mAppInfo.packageName); } - finish(); + clearCachedApkIfNeededAndFinish(); } else if(v == mLaunchButton) { startActivity(mLaunchIntent); - finish(); + clearCachedApkIfNeededAndFinish(); } } public void onCancel(DialogInterface dialog) { + clearCachedApkIfNeededAndFinish(); + } + + private void clearCachedApkIfNeededAndFinish() { + // If we are installing from a content:// the apk is copied in the cache + // dir and passed in here. As we aren't started for a result because our + // caller needs to be able to forward the result, here we make sure the + // staging file in the cache dir is removed. + if ("file".equals(mPackageURI.getScheme()) && mPackageURI.getPath() != null + && mPackageURI.getPath().startsWith(getCacheDir().toString())) { + File file = new File(mPackageURI.getPath()); + file.delete(); + } finish(); } } diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java index ab4c6045..cbb9f646 100644 --- a/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -72,7 +72,6 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen private static final String TAG = "PackageInstaller"; private static final int REQUEST_ENABLE_UNKNOWN_SOURCES = 1; - private static final int REQUEST_INSTALL_PACKAGE = 2; private static final String SCHEME_FILE = "file"; private static final String SCHEME_CONTENT = "content"; @@ -324,7 +323,6 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen if (request == REQUEST_ENABLE_UNKNOWN_SOURCES && result == RESULT_OK) { initiateInstall(); } - clearCachedApkIfNeededAndFinish(); } private boolean isInstallRequestFromUnknownSource(Intent intent) { @@ -684,7 +682,8 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); } if(localLOGV) Log.i(TAG, "downloaded app uri="+mPackageURI); - startActivityForResult(newIntent, REQUEST_INSTALL_PACKAGE); + startActivity(newIntent); + finish(); } private void clearCachedApkIfNeededAndFinish() { -- cgit v1.2.3