From 8538fde237709464ec899a402fee29c0169f6bfa Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Thu, 7 Aug 2014 13:59:43 -0700 Subject: Extend to support install sessions. Light changes to existing code to support pre-staged install sessions. Only inspects a base APK from session, which defines all permissions. Bug: 16515814 Change-Id: Ia1cb43ff9fdfe1f2468ad0d1374cff2b8eb50f54 --- .../packageinstaller/PackageInstallerActivity.java | 105 ++++++++++++++------- 1 file changed, 71 insertions(+), 34 deletions(-) (limited to 'src') diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java index 67c9f3e4..2c58be80 100644 --- a/src/com/android/packageinstaller/PackageInstallerActivity.java +++ b/src/com/android/packageinstaller/PackageInstallerActivity.java @@ -26,8 +26,10 @@ import android.content.DialogInterface.OnCancelListener; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; +import android.content.pm.InstallSessionInfo; import android.content.pm.ManifestDigest; import android.content.pm.PackageInfo; +import android.content.pm.PackageInstaller; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; import android.content.pm.PackageParser; @@ -65,6 +67,8 @@ import java.util.List; */ public class PackageInstallerActivity extends Activity implements OnCancelListener, OnClickListener { private static final String TAG = "PackageInstaller"; + + private int mSessionId = -1; private Uri mPackageURI; private Uri mOriginatingURI; private Uri mReferrerURI; @@ -73,6 +77,7 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen private boolean localLOGV = false; PackageManager mPm; + PackageInstaller mInstaller; PackageInfo mPkgInfo; ApplicationInfo mSourceInfo; @@ -422,12 +427,29 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen protected void onCreate(Bundle icicle) { super.onCreate(icicle); - // get intent information - final Intent intent = getIntent(); - mPackageURI = intent.getData(); - mOriginatingURI = intent.getParcelableExtra(Intent.EXTRA_ORIGINATING_URI); - mReferrerURI = intent.getParcelableExtra(Intent.EXTRA_REFERRER); mPm = getPackageManager(); + mInstaller = mPm.getPackageInstaller(); + + final Intent intent = getIntent(); + if (PackageInstaller.ACTION_CONFIRM_PERMISSIONS.equals(intent.getAction())) { + final int sessionId = intent.getIntExtra(PackageInstaller.EXTRA_SESSION_ID, -1); + final InstallSessionInfo info = mInstaller.getSessionInfo(sessionId); + if (info == null || !info.sealed || info.resolvedBaseCodePath == null) { + Log.w(TAG, "Session " + mSessionId + " in funky state; ignoring"); + finish(); + return; + } + + mSessionId = sessionId; + mPackageURI = Uri.fromFile(new File(info.resolvedBaseCodePath)); + mOriginatingURI = null; + mReferrerURI = null; + } else { + mSessionId = -1; + mPackageURI = intent.getData(); + mOriginatingURI = intent.getParcelableExtra(Intent.EXTRA_ORIGINATING_URI); + mReferrerURI = intent.getParcelableExtra(Intent.EXTRA_REFERRER); + } boolean requestFromUnknownSource = isInstallRequestFromUnknownSource(intent); mInstallFlowAnalytics = new InstallFlowAnalytics(); @@ -585,6 +607,9 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen @Override public void onBackPressed() { + if (mSessionId != -1) { + mInstaller.setPermissionsResult(mSessionId, false); + } mInstallFlowAnalytics.setFlowFinished( InstallFlowAnalytics.RESULT_CANCELLED_BY_USER); super.onBackPressed(); @@ -598,37 +623,46 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen public void onClick(View v) { if(v == mOk) { if (mOkCanInstall || mScrollView == null) { - // Start subactivity to actually install the application mInstallFlowAnalytics.setInstallButtonClicked(); - Intent newIntent = new Intent(); - newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, - mPkgInfo.applicationInfo); - newIntent.setData(mPackageURI); - newIntent.setClass(this, InstallAppProgress.class); - newIntent.putExtra(InstallAppProgress.EXTRA_MANIFEST_DIGEST, mPkgDigest); - newIntent.putExtra( - InstallAppProgress.EXTRA_INSTALL_FLOW_ANALYTICS, mInstallFlowAnalytics); - String installerPackageName = getIntent().getStringExtra( - Intent.EXTRA_INSTALLER_PACKAGE_NAME); - if (mOriginatingURI != null) { - newIntent.putExtra(Intent.EXTRA_ORIGINATING_URI, mOriginatingURI); - } - if (mReferrerURI != null) { - newIntent.putExtra(Intent.EXTRA_REFERRER, mReferrerURI); - } - if (mOriginatingUid != VerificationParams.NO_UID) { - newIntent.putExtra(Intent.EXTRA_ORIGINATING_UID, mOriginatingUid); - } - if (installerPackageName != null) { - newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, - installerPackageName); - } - if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) { - newIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true); - newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + if (mSessionId != -1) { + mInstaller.setPermissionsResult(mSessionId, true); + + // We're only confirming permissions, so we don't really know how the + // story ends; assume success. + mInstallFlowAnalytics.setFlowFinishedWithPackageManagerResult( + PackageManager.INSTALL_SUCCEEDED); + } else { + // Start subactivity to actually install the application + Intent newIntent = new Intent(); + newIntent.putExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO, + mPkgInfo.applicationInfo); + newIntent.setData(mPackageURI); + newIntent.setClass(this, InstallAppProgress.class); + newIntent.putExtra(InstallAppProgress.EXTRA_MANIFEST_DIGEST, mPkgDigest); + newIntent.putExtra( + InstallAppProgress.EXTRA_INSTALL_FLOW_ANALYTICS, mInstallFlowAnalytics); + String installerPackageName = getIntent().getStringExtra( + Intent.EXTRA_INSTALLER_PACKAGE_NAME); + if (mOriginatingURI != null) { + newIntent.putExtra(Intent.EXTRA_ORIGINATING_URI, mOriginatingURI); + } + if (mReferrerURI != null) { + newIntent.putExtra(Intent.EXTRA_REFERRER, mReferrerURI); + } + if (mOriginatingUid != VerificationParams.NO_UID) { + newIntent.putExtra(Intent.EXTRA_ORIGINATING_UID, mOriginatingUid); + } + if (installerPackageName != null) { + newIntent.putExtra(Intent.EXTRA_INSTALLER_PACKAGE_NAME, + installerPackageName); + } + if (getIntent().getBooleanExtra(Intent.EXTRA_RETURN_RESULT, false)) { + newIntent.putExtra(Intent.EXTRA_RETURN_RESULT, true); + newIntent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + } + if(localLOGV) Log.i(TAG, "downloaded app uri="+mPackageURI); + startActivity(newIntent); } - if(localLOGV) Log.i(TAG, "downloaded app uri="+mPackageURI); - startActivity(newIntent); finish(); } else { mScrollView.pageScroll(View.FOCUS_DOWN); @@ -636,6 +670,9 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen } else if(v == mCancel) { // Cancel and finish setResult(RESULT_CANCELED); + if (mSessionId != -1) { + mInstaller.setPermissionsResult(mSessionId, false); + } mInstallFlowAnalytics.setFlowFinished( InstallFlowAnalytics.RESULT_CANCELLED_BY_USER); finish(); -- cgit v1.2.3