diff options
-rw-r--r-- | AndroidManifest.xml | 34 | ||||
-rw-r--r-- | src/com/android/packageinstaller/PackageInstallerActivity.java | 105 |
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(); |