summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-08-07 13:59:43 -0700
committerJeff Sharkey <jsharkey@android.com>2014-08-07 15:23:24 -0700
commit8538fde237709464ec899a402fee29c0169f6bfa (patch)
treeef129ecbcd1b4a0d1ee773b7c0fe78b7adc25ab7
parent0fb1d516cf0b8a6efd29e3fc2f8556a555044c32 (diff)
downloadandroid_packages_apps_PackageInstaller-8538fde237709464ec899a402fee29c0169f6bfa.tar.gz
android_packages_apps_PackageInstaller-8538fde237709464ec899a402fee29c0169f6bfa.tar.bz2
android_packages_apps_PackageInstaller-8538fde237709464ec899a402fee29c0169f6bfa.zip
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
-rw-r--r--AndroidManifest.xml34
-rw-r--r--src/com/android/packageinstaller/PackageInstallerActivity.java105
2 files changed, 90 insertions, 49 deletions
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 93ed65d2..66d22542 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -13,10 +13,13 @@
<uses-permission android:name="android.permission.MANAGE_USERS" />
<uses-permission android:name="android.permission.GRANT_REVOKE_PERMISSIONS" />
<uses-permission android:name="android.permission.INTERACT_ACROSS_USERS_FULL" />
+ <uses-permission android:name="android.permission.READ_INSTALL_SESSIONS" />
+
<application android:label="@string/app_name"
android:allowBackup="false"
android:theme="@android:style/Theme.DeviceDefault.DialogWhenLarge.NoActionBar"
android:supportsRtl="true">
+
<activity android:name=".PackageInstallerActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="true">
@@ -33,10 +36,16 @@
<data android:scheme="file" />
<data android:scheme="package" />
</intent-filter>
+ <intent-filter>
+ <action android:name="android.content.pm.action.CONFIRM_PERMISSIONS" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
</activity>
+
<activity android:name=".InstallAppProgress"
- android:configChanges="orientation|keyboardHidden|screenSize">
- </activity>
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:exported="false" />
+
<activity android:name=".UninstallerActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="true"
@@ -48,25 +57,20 @@
<data android:scheme="package" />
</intent-filter>
</activity>
+
<activity android:name=".UninstallAppProgress"
- android:configChanges="orientation|keyboardHidden|screenSize">
- </activity>
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:exported="false" />
+
<activity android:name=".GrantActivity"
- android:configChanges="orientation|keyboardHidden|screenSize"
- android:excludeFromRecents="true"
- android:theme="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
+ android:configChanges="orientation|keyboardHidden|screenSize"
+ android:excludeFromRecents="true"
+ android:theme="@android:style/Theme.DeviceDefault.Dialog.NoActionBar">
<intent-filter>
<action android:name="android.content.pm.action.REQUEST_PERMISSION" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
- <!--
- <receiver android:name=".RemoveReceiver">
- <intent-filter>
- <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
- <data android:scheme="package" />
- </intent-filter>
- </receiver>
- -->
+
</application>
</manifest>
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();