summaryrefslogtreecommitdiffstats
path: root/src/com/android/packageinstaller/permission/model
diff options
context:
space:
mode:
authorSvet Ganov <svetoslavganov@google.com>2016-02-27 11:12:13 -0800
committerSvet Ganov <svetoslavganov@google.com>2016-04-21 20:33:03 -0700
commitf9bf4f795615bac03d1b35a0138318473b1ef6bf (patch)
tree2acbadfd1827e64c6478e12dcd114d4948a4744c /src/com/android/packageinstaller/permission/model
parentedbf987e33d5710ec765ef3a7e516db65057a8b7 (diff)
downloadandroid_packages_apps_PackageInstaller-f9bf4f795615bac03d1b35a0138318473b1ef6bf.tar.gz
android_packages_apps_PackageInstaller-f9bf4f795615bac03d1b35a0138318473b1ef6bf.tar.bz2
android_packages_apps_PackageInstaller-f9bf4f795615bac03d1b35a0138318473b1ef6bf.zip
Cleanup of the PackageInstaller API - PackageInstaller
The PackageInstaller app manages side-loading apps as well as permission management. It should be updatable, hence should rely on system APIs to talk to the platform. This is the first step of defining an API boundary. Change-Id: I37aea1e5cc3195b8b636af6790af45fe5a9765cd
Diffstat (limited to 'src/com/android/packageinstaller/permission/model')
-rw-r--r--src/com/android/packageinstaller/permission/model/AppPermissionGroup.java16
-rw-r--r--src/com/android/packageinstaller/permission/model/Permission.java9
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionApps.java9
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionGroups.java2
-rw-r--r--src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java118
5 files changed, 126 insertions, 28 deletions
diff --git a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
index 214571ba..ca66449d 100644
--- a/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
+++ b/src/com/android/packageinstaller/permission/model/AppPermissionGroup.java
@@ -25,11 +25,12 @@ import android.content.pm.PackageManager;
import android.content.pm.PermissionGroupInfo;
import android.content.pm.PermissionInfo;
import android.os.Build;
+import android.os.Process;
import android.os.UserHandle;
import android.util.ArrayMap;
-import com.android.internal.util.ArrayUtils;
import com.android.packageinstaller.R;
+import com.android.packageinstaller.permission.utils.ArrayUtils;
import com.android.packageinstaller.permission.utils.LocationUtils;
import java.util.ArrayList;
@@ -93,7 +94,7 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
}
return create(context, packageInfo, groupInfo, permissionInfos,
- new UserHandle(context.getUserId()));
+ Process.myUserHandle());
}
public static AppPermissionGroup create(Context context, PackageInfo packageInfo,
@@ -145,11 +146,10 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
final boolean granted = (packageInfo.requestedPermissionsFlags[i]
& PackageInfo.REQUESTED_PERMISSION_GRANTED) != 0;
- final int appOp = PLATFORM_PACKAGE_NAME.equals(requestedPermissionInfo.packageName)
- ? AppOpsManager.permissionToOpCode(requestedPermissionInfo.name)
- : AppOpsManager.OP_NONE;
+ final String appOp = PLATFORM_PACKAGE_NAME.equals(requestedPermissionInfo.packageName)
+ ? AppOpsManager.permissionToOp(requestedPermissionInfo.name) : null;
- final boolean appOpAllowed = appOp != AppOpsManager.OP_NONE
+ final boolean appOpAllowed = appOp != null
&& context.getSystemService(AppOpsManager.class).checkOpNoThrow(appOp,
packageInfo.applicationInfo.uid, packageInfo.packageName)
== AppOpsManager.MODE_ALLOWED;
@@ -308,8 +308,8 @@ public final class AppPermissionGroup implements Comparable<AppPermissionGroup>
if (permission.isGranted()) {
return true;
}
- } else if (permission.isGranted() && (permission.getAppOp()
- == AppOpsManager.OP_NONE || permission.isAppOpAllowed())) {
+ } else if (permission.isGranted() && (permission.getAppOp() == null
+ || permission.isAppOpAllowed())) {
return true;
}
}
diff --git a/src/com/android/packageinstaller/permission/model/Permission.java b/src/com/android/packageinstaller/permission/model/Permission.java
index 0425c604..f9dc6e8e 100644
--- a/src/com/android/packageinstaller/permission/model/Permission.java
+++ b/src/com/android/packageinstaller/permission/model/Permission.java
@@ -16,19 +16,18 @@
package com.android.packageinstaller.permission.model;
-import android.app.AppOpsManager;
import android.content.pm.PackageManager;
public final class Permission {
private final String mName;
- private final int mAppOp;
+ private final String mAppOp;
private boolean mGranted;
private boolean mAppOpAllowed;
private int mFlags;
public Permission(String name, boolean granted,
- int appOp, boolean appOpAllowed, int flags) {
+ String appOp, boolean appOpAllowed, int flags) {
mName = name;
mGranted = granted;
mAppOp = appOp;
@@ -40,7 +39,7 @@ public final class Permission {
return mName;
}
- public int getAppOp() {
+ public String getAppOp() {
return mAppOp;
}
@@ -49,7 +48,7 @@ public final class Permission {
}
public boolean hasAppOp() {
- return mAppOp != AppOpsManager.OP_NONE;
+ return mAppOp != null;
}
public boolean isGranted() {
diff --git a/src/com/android/packageinstaller/permission/model/PermissionApps.java b/src/com/android/packageinstaller/permission/model/PermissionApps.java
index 2c0508a5..b40b5b9f 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionApps.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionApps.java
@@ -24,6 +24,7 @@ import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.PermissionInfo;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
+import android.os.Process;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.ArrayMap;
@@ -32,7 +33,7 @@ import android.util.Log;
import android.util.SparseArray;
import com.android.packageinstaller.R;
-import com.android.packageinstaller.util.Utils;
+import com.android.packageinstaller.permission.utils.Utils;
import java.util.ArrayList;
import java.util.Collections;
@@ -148,7 +149,8 @@ public class PermissionApps {
ArrayList<PermissionApp> permApps = new ArrayList<>();
- for (UserHandle user : UserManager.get(mContext).getUserProfiles()) {
+ UserManager userManager = mContext.getSystemService(UserManager.class);
+ for (UserHandle user : userManager.getUserProfiles()) {
List<PackageInfo> apps = mCache != null ? mCache.getPackages(user.getIdentifier())
: mPm.getInstalledPackagesAsUser(PackageManager.GET_PERMISSIONS,
user.getIdentifier());
@@ -250,8 +252,7 @@ public class PermissionApps {
return null;
}
Drawable unbadged = appInfo.loadUnbadgedIcon(mPm);
- return mPm.getUserBadgedIcon(unbadged,
- new UserHandle(UserHandle.getUserId(appInfo.uid)));
+ return mPm.getUserBadgedIcon(unbadged, Process.myUserHandle());
}
private void loadGroupInfo() {
diff --git a/src/com/android/packageinstaller/permission/model/PermissionGroups.java b/src/com/android/packageinstaller/permission/model/PermissionGroups.java
index 04dd07ff..8ca69f24 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionGroups.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionGroups.java
@@ -31,7 +31,7 @@ import android.os.Bundle;
import android.util.ArraySet;
import com.android.packageinstaller.R;
-import com.android.packageinstaller.util.Utils;
+import com.android.packageinstaller.permission.utils.Utils;
import java.util.ArrayList;
import java.util.Collections;
diff --git a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
index d7e4547a..a87976a6 100644
--- a/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
+++ b/src/com/android/packageinstaller/permission/model/PermissionStatusReceiver.java
@@ -26,19 +26,117 @@ import android.util.ArrayMap;
import android.util.ArraySet;
import com.android.packageinstaller.permission.model.PermissionApps.PermissionApp;
-import com.android.packageinstaller.util.Utils;
+import com.android.packageinstaller.permission.utils.Utils;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
+/**
+ * This class handles backwards compatibility for M. Don't remove
+ * until we decide to drop M support altogether.
+ */
public class PermissionStatusReceiver extends BroadcastReceiver {
+
+ /**
+ * Broadcast action that requests current permission granted information. It will respond
+ * to the request by sending a broadcast with action defined by
+ * {@link #EXTRA_GET_PERMISSIONS_RESPONSE_INTENT}. The response will contain
+ * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}, as well as
+ * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}, with contents described below or
+ * a null upon failure.
+ *
+ * <p>If {@link Intent#EXTRA_PACKAGE_NAME} is included then the number of permissions granted, the
+ * number of permissions requested and the number of granted additional permissions
+ * by that package will be calculated and included as the first
+ * and second elements respectively of an int[] in the response as
+ * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}. The response will also deliver the list
+ * of localized permission group names that are granted in
+ * {@link #EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT}.
+ *
+ * <p>If {@link #EXTRA_PACKAGE_NAME} is not included then the number of apps granted any runtime
+ * permissions and the total number of apps requesting runtime permissions will be the first
+ * and second elements respectively of an int[] in the response as
+ * {@link #EXTRA_GET_PERMISSIONS_COUNT_RESULT}.
+ *
+ * @hide
+ */
+ public static final String ACTION_GET_PERMISSIONS_COUNT
+ = "android.intent.action.GET_PERMISSIONS_COUNT";
+
+ /**
+ * Broadcast action that requests list of all apps that have runtime permissions. It will
+ * respond to the request by sending a broadcast with action defined by
+ * {@link #EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT}. The response will contain
+ * {@link #EXTRA_GET_PERMISSIONS_APP_LIST_RESULT}, as well as
+ * {@link #EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT}, with contents described below or
+ * a null upon failure.
+ *
+ * <p>{@link #EXTRA_GET_PERMISSIONS_APP_LIST_RESULT} will contain a list of package names of
+ * apps that have runtime permissions. {@link #EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT}
+ * will contain the list of app labels corresponding ot the apps in the first list.
+ *
+ * @hide
+ */
+ public static final String ACTION_GET_PERMISSIONS_PACKAGES
+ = "android.intent.action.GET_PERMISSIONS_PACKAGES";
+
+ /**
+ * Extra included in response to {@link #ACTION_GET_PERMISSIONS_COUNT}.
+ * @hide
+ */
+ public static final String EXTRA_GET_PERMISSIONS_COUNT_RESULT
+ = "android.intent.extra.GET_PERMISSIONS_COUNT_RESULT";
+
+ /**
+ * List of CharSequence of localized permission group labels.
+ * @hide
+ */
+ public static final String EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT
+ = "android.intent.extra.GET_PERMISSIONS_GROUP_LIST_RESULT";
+
+ /**
+ * String list of apps that have one or more runtime permissions.
+ * @hide
+ */
+ public static final String EXTRA_GET_PERMISSIONS_APP_LIST_RESULT
+ = "android.intent.extra.GET_PERMISSIONS_APP_LIST_RESULT";
+
+ /**
+ * String list of app labels for apps that have one or more runtime permissions.
+ * @hide
+ */
+ public static final String EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT
+ = "android.intent.extra.GET_PERMISSIONS_APP_LABEL_LIST_RESULT";
+
+ /**
+ * Boolean list describing if the app is a system app for apps that have one or more runtime
+ * permissions.
+ * @hide
+ */
+ public static final String EXTRA_GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT
+ = "android.intent.extra.GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT";
+
+ /**
+ * Required extra to be sent with {@link #ACTION_GET_PERMISSIONS_COUNT} broadcasts.
+ * @hide
+ */
+ public static final String EXTRA_GET_PERMISSIONS_RESPONSE_INTENT
+ = "android.intent.extra.GET_PERMISSIONS_RESONSE_INTENT";
+
+ /**
+ * Required extra to be sent with {@link #ACTION_GET_PERMISSIONS_PACKAGES} broadcasts.
+ * @hide
+ */
+ public static final String EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT
+ = "android.intent.extra.GET_PERMISSIONS_PACKAGES_RESONSE_INTENT";
+
@Override
public void onReceive(Context context, Intent intent) {
- if (Intent.ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) {
+ if (ACTION_GET_PERMISSIONS_COUNT.equals(intent.getAction())) {
Intent responseIntent = new Intent(intent.getStringExtra(
- Intent.EXTRA_GET_PERMISSIONS_RESPONSE_INTENT));
+ EXTRA_GET_PERMISSIONS_RESPONSE_INTENT));
responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
int[] counts = new int[3];
@@ -54,28 +152,28 @@ public class PermissionStatusReceiver extends BroadcastReceiver {
succeeded = getAppsWithPermissionsCount(context, counts);
}
if (succeeded) {
- responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts);
+ responseIntent.putExtra(EXTRA_GET_PERMISSIONS_COUNT_RESULT, counts);
if (isForPackage) {
- responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT,
+ responseIntent.putExtra(EXTRA_GET_PERMISSIONS_GROUP_LIST_RESULT,
grantedGroups.toArray(new CharSequence[grantedGroups.size()]));
}
}
context.sendBroadcast(responseIntent);
- } else if (Intent.ACTION_GET_PERMISSIONS_PACKAGES.equals(intent.getAction())) {
+ } else if (ACTION_GET_PERMISSIONS_PACKAGES.equals(intent.getAction())) {
Intent responseIntent = new Intent(intent.getStringExtra(
- Intent.EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT));
+ EXTRA_GET_PERMISSIONS_PACKAGES_RESPONSE_INTENT));
responseIntent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
List<String> appsList = new ArrayList<>();
List<CharSequence> appLabelsList = new ArrayList<>();
List<Boolean> isSystemAppList = new ArrayList<>();
if (getAppsWithRuntimePermissions(context, appsList, appLabelsList, isSystemAppList)) {
- responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LIST_RESULT,
+ responseIntent.putExtra(EXTRA_GET_PERMISSIONS_APP_LIST_RESULT,
appsList.toArray(new String[appsList.size()]));
- responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT,
+ responseIntent.putExtra(EXTRA_GET_PERMISSIONS_APP_LABEL_LIST_RESULT,
appLabelsList.toArray(new String[appLabelsList.size()]));
- responseIntent.putExtra(Intent.EXTRA_GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT,
+ responseIntent.putExtra(EXTRA_GET_PERMISSIONS_IS_SYSTEM_APP_LIST_RESULT,
toPrimitiveBoolArray(isSystemAppList));
}
context.sendBroadcast(responseIntent);