diff options
author | Dianne Hackborn <hackbod@google.com> | 2013-01-16 17:56:46 -0800 |
---|---|---|
committer | Dianne Hackborn <hackbod@google.com> | 2013-01-16 18:10:40 -0800 |
commit | e799175b6ba3aadd972f4b861758d675d1f93987 (patch) | |
tree | 2468fd79769eecff660a7c2d2163fb8ae0a11fca /core | |
parent | 35654b61e8fe7bc85afcb076ddbb590d51c5865f (diff) | |
download | frameworks_base-e799175b6ba3aadd972f4b861758d675d1f93987.zip frameworks_base-e799175b6ba3aadd972f4b861758d675d1f93987.tar.gz frameworks_base-e799175b6ba3aadd972f4b861758d675d1f93987.tar.bz2 |
AppOps: fix nested op tracking, new API to get apps using
permissions.
Change-Id: I20c7bd58febc01d6911a90440867eaacd133c464
Diffstat (limited to 'core')
-rw-r--r-- | core/java/android/app/ApplicationPackageManager.java | 22 | ||||
-rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 9 | ||||
-rw-r--r-- | core/java/android/content/pm/PackageManager.java | 38 |
3 files changed, 66 insertions, 3 deletions
diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 03d1a3f..2ef3944 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -444,6 +444,28 @@ final class ApplicationPackageManager extends PackageManager { @SuppressWarnings("unchecked") @Override + public List<PackageInfo> getPackagesHoldingPermissions( + String[] permissions, int flags) { + final int userId = mContext.getUserId(); + try { + final List<PackageInfo> packageInfos = new ArrayList<PackageInfo>(); + PackageInfo lastItem = null; + ParceledListSlice<PackageInfo> slice; + + do { + final String lastKey = lastItem != null ? lastItem.packageName : null; + slice = mPM.getPackagesHoldingPermissions(permissions, flags, lastKey, userId); + lastItem = slice.populateList(packageInfos, PackageInfo.CREATOR); + } while (!slice.isLastSlice()); + + return packageInfos; + } catch (RemoteException e) { + throw new RuntimeException("Package manager has died", e); + } + } + + @SuppressWarnings("unchecked") + @Override public List<ApplicationInfo> getInstalledApplications(int flags) { final int userId = mContext.getUserId(); try { diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index b9e432c..4c9c278 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -130,6 +130,15 @@ interface IPackageManager { ParceledListSlice getInstalledPackages(int flags, in String lastRead, in int userId); /** + * This implements getPackagesHoldingPermissions via a "last returned row" + * mechanism that is not exposed in the API. This is to get around the IPC + * limit that kicks in when flags are included that bloat up the data + * returned. + */ + ParceledListSlice getPackagesHoldingPermissions(in String[] permissions, + int flags, in String lastRead, int userId); + + /** * This implements getInstalledApplications via a "last returned row" * mechanism that is not exposed in the API. This is to get around the IPC * limit that kicks in when flags are included that bloat up the data diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index cdd9195..a69f220 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1512,11 +1512,43 @@ public abstract class PackageManager { * @see #GET_SERVICES * @see #GET_SIGNATURES * @see #GET_UNINSTALLED_PACKAGES - * */ public abstract List<PackageInfo> getInstalledPackages(int flags); /** + * Return a List of all installed packages that are currently + * holding any of the given permissions. + * + * @param flags Additional option flags. Use any combination of + * {@link #GET_ACTIVITIES}, + * {@link #GET_GIDS}, + * {@link #GET_CONFIGURATIONS}, + * {@link #GET_INSTRUMENTATION}, + * {@link #GET_PERMISSIONS}, + * {@link #GET_PROVIDERS}, + * {@link #GET_RECEIVERS}, + * {@link #GET_SERVICES}, + * {@link #GET_SIGNATURES}, + * {@link #GET_UNINSTALLED_PACKAGES} to modify the data returned. + * + * @return Returns a List of PackageInfo objects, one for each installed + * application that is holding any of the permissions that were provided. + * + * @see #GET_ACTIVITIES + * @see #GET_GIDS + * @see #GET_CONFIGURATIONS + * @see #GET_INSTRUMENTATION + * @see #GET_PERMISSIONS + * @see #GET_PROVIDERS + * @see #GET_RECEIVERS + * @see #GET_SERVICES + * @see #GET_SIGNATURES + * @see #GET_UNINSTALLED_PACKAGES + */ + public abstract List<PackageInfo> getPackagesHoldingPermissions( + String[] permissions, int flags); + + /** * Return a List of all packages that are installed on the device, for a specific user. * Requesting a list of installed packages for another user * will require the permission INTERACT_ACROSS_USERS_FULL. @@ -1742,14 +1774,14 @@ public abstract class PackageManager { /** * Return a List of all application packages that are installed on the * device. If flag GET_UNINSTALLED_PACKAGES has been set, a list of all - * applications including those deleted with DONT_DELETE_DATA(partially + * applications including those deleted with DONT_DELETE_DATA (partially * installed apps with data directory) will be returned. * * @param flags Additional option flags. Use any combination of * {@link #GET_META_DATA}, {@link #GET_SHARED_LIBRARY_FILES}, * {@link #GET_UNINSTALLED_PACKAGES} to modify the data returned. * - * @return A List of ApplicationInfo objects, one for each application that + * @return Returns a List of ApplicationInfo objects, one for each application that * is installed on the device. In the unlikely case of there being * no installed applications, an empty list is returned. * If flag GET_UNINSTALLED_PACKAGES is set, a list of all |