summaryrefslogtreecommitdiffstats
path: root/core/java/android/content
diff options
context:
space:
mode:
authorJeff Sharkey <jsharkey@android.com>2014-08-07 14:01:43 -0700
committerJeff Sharkey <jsharkey@google.com>2014-08-07 22:40:38 +0000
commit7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8 (patch)
tree7aae8c8c52ed75fcd9fdfbe7c0a3743e6afd3a66 /core/java/android/content
parente8e91925074479fc06310418b58b54f49d051801 (diff)
downloadframeworks_base-7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8.zip
frameworks_base-7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8.tar.gz
frameworks_base-7328a1b39b3dae1c0cd390c0a3695c6a46b8e9d8.tar.bz2
Logic to confirm permissions on install sessions.
When an app without INSTALL permission attempts to commit a session, we involve user to confirm permissions. We currently point at the base APK, which defines all permissions for an app, handling the case where a session may only be adding splits. Add failure codes to represent rejection. Fix bug by ignoring stages during initial boot scan. Bug: 16515814 Change-Id: I702bb72445216817bcc62b79c83980c1c2bb0120
Diffstat (limited to 'core/java/android/content')
-rw-r--r--core/java/android/content/pm/IPackageInstaller.aidl2
-rw-r--r--core/java/android/content/pm/InstallSessionInfo.java9
-rw-r--r--core/java/android/content/pm/PackageInstaller.java27
-rw-r--r--core/java/android/content/pm/PackageManager.java9
4 files changed, 41 insertions, 6 deletions
diff --git a/core/java/android/content/pm/IPackageInstaller.aidl b/core/java/android/content/pm/IPackageInstaller.aidl
index cc0d569..5223476 100644
--- a/core/java/android/content/pm/IPackageInstaller.aidl
+++ b/core/java/android/content/pm/IPackageInstaller.aidl
@@ -36,4 +36,6 @@ interface IPackageInstaller {
void uninstall(String packageName, int flags, in IPackageDeleteObserver2 observer, int userId);
void uninstallSplit(String packageName, String splitName, int flags, in IPackageDeleteObserver2 observer, int userId);
+
+ void setPermissionsResult(int sessionId, boolean accepted);
}
diff --git a/core/java/android/content/pm/InstallSessionInfo.java b/core/java/android/content/pm/InstallSessionInfo.java
index f263885..161bcde 100644
--- a/core/java/android/content/pm/InstallSessionInfo.java
+++ b/core/java/android/content/pm/InstallSessionInfo.java
@@ -16,7 +16,6 @@
package android.content.pm;
-import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Intent;
import android.graphics.Bitmap;
@@ -33,8 +32,12 @@ public class InstallSessionInfo implements Parcelable {
/** {@hide} */
public String installerPackageName;
/** {@hide} */
+ public String resolvedBaseCodePath;
+ /** {@hide} */
public float progress;
/** {@hide} */
+ public boolean sealed;
+ /** {@hide} */
public boolean open;
/** {@hide} */
@@ -56,7 +59,9 @@ public class InstallSessionInfo implements Parcelable {
public InstallSessionInfo(Parcel source) {
sessionId = source.readInt();
installerPackageName = source.readString();
+ resolvedBaseCodePath = source.readString();
progress = source.readFloat();
+ sealed = source.readInt() != 0;
open = source.readInt() != 0;
mode = source.readInt();
@@ -149,7 +154,9 @@ public class InstallSessionInfo implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(sessionId);
dest.writeString(installerPackageName);
+ dest.writeString(resolvedBaseCodePath);
dest.writeFloat(progress);
+ dest.writeInt(sealed ? 1 : 0);
dest.writeInt(open ? 1 : 0);
dest.writeInt(mode);
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 01c080d..525142b 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -81,6 +81,10 @@ public class PackageInstaller {
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
public static final String ACTION_SESSION_DETAILS = "android.content.pm.action.SESSION_DETAILS";
+ /** {@hide} */
+ public static final String
+ ACTION_CONFIRM_PERMISSIONS = "android.content.pm.action.CONFIRM_PERMISSIONS";
+
/**
* An integer session ID.
*
@@ -206,6 +210,15 @@ public class PackageInstaller {
}
}
+ /** {@hide} */
+ public void setPermissionsResult(int sessionId, boolean accepted) {
+ try {
+ mInstaller.setPermissionsResult(sessionId, accepted);
+ } catch (RemoteException e) {
+ throw e.rethrowAsRuntimeException();
+ }
+ }
+
/**
* Events for observing session lifecycle.
* <p>
@@ -603,9 +616,8 @@ public class PackageInstaller {
* permission, incompatible certificates, etc. The user may be able to
* uninstall another app to fix the issue.
* <p>
- * The extras bundle may contain {@link #EXTRA_PACKAGE_NAME} if one
- * specific package was identified as the cause of the conflict. If
- * unknown, or multiple packages, the extra may be {@code null}.
+ * The extras bundle may contain {@link #EXTRA_PACKAGE_NAME} with the
+ * specific packages identified as the cause of the conflict.
*/
public static final int FAILURE_CONFLICT = 2;
@@ -626,6 +638,15 @@ public class PackageInstaller {
*/
public static final int FAILURE_INCOMPATIBLE = 4;
+ /**
+ * This install session failed because it was rejected. For example, the
+ * user declined requested permissions, or a package verifier rejected
+ * the session.
+ *
+ * @see PackageManager#VERIFICATION_REJECT
+ */
+ public static final int FAILURE_REJECTED = 5;
+
public static final String EXTRA_PACKAGE_NAME = "android.content.pm.extra.PACKAGE_NAME";
/**
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 1e4ed31..d5604cb 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -770,6 +770,9 @@ public abstract class PackageManager {
*/
public static final int NO_NATIVE_LIBRARIES = -114;
+ /** {@hide} */
+ public static final int INSTALL_FAILED_REJECTED = -115;
+
/**
* Flag parameter for {@link #deletePackage} to indicate that you don't want to delete the
* package's data directory.
@@ -3830,6 +3833,7 @@ public abstract class PackageManager {
case INSTALL_FAILED_USER_RESTRICTED: return "INSTALL_FAILED_USER_RESTRICTED";
case INSTALL_FAILED_DUPLICATE_PERMISSION: return "INSTALL_FAILED_DUPLICATE_PERMISSION";
case INSTALL_FAILED_NO_MATCHING_ABIS: return "INSTALL_FAILED_NO_MATCHING_ABIS";
+ case INSTALL_FAILED_REJECTED: return "INSTALL_FAILED_REJECTED";
default: return Integer.toString(status);
}
}
@@ -3857,8 +3861,8 @@ public abstract class PackageManager {
case INSTALL_FAILED_CONTAINER_ERROR: return CommitCallback.FAILURE_STORAGE;
case INSTALL_FAILED_INVALID_INSTALL_LOCATION: return CommitCallback.FAILURE_STORAGE;
case INSTALL_FAILED_MEDIA_UNAVAILABLE: return CommitCallback.FAILURE_STORAGE;
- case INSTALL_FAILED_VERIFICATION_TIMEOUT: return CommitCallback.FAILURE_UNKNOWN;
- case INSTALL_FAILED_VERIFICATION_FAILURE: return CommitCallback.FAILURE_UNKNOWN;
+ case INSTALL_FAILED_VERIFICATION_TIMEOUT: return CommitCallback.FAILURE_REJECTED;
+ case INSTALL_FAILED_VERIFICATION_FAILURE: return CommitCallback.FAILURE_REJECTED;
case INSTALL_FAILED_PACKAGE_CHANGED: return CommitCallback.FAILURE_INVALID;
case INSTALL_FAILED_UID_CHANGED: return CommitCallback.FAILURE_INVALID;
case INSTALL_FAILED_VERSION_DOWNGRADE: return CommitCallback.FAILURE_INVALID;
@@ -3876,6 +3880,7 @@ public abstract class PackageManager {
case INSTALL_FAILED_USER_RESTRICTED: return CommitCallback.FAILURE_INCOMPATIBLE;
case INSTALL_FAILED_DUPLICATE_PERMISSION: return CommitCallback.FAILURE_CONFLICT;
case INSTALL_FAILED_NO_MATCHING_ABIS: return CommitCallback.FAILURE_INCOMPATIBLE;
+ case INSTALL_FAILED_REJECTED: return CommitCallback.FAILURE_REJECTED;
default: return CommitCallback.FAILURE_UNKNOWN;
}
}