diff options
| -rw-r--r-- | core/java/android/permission/PermissionManager.java | 5 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/permission/PermissionManagerService.java | 40 |
2 files changed, 42 insertions, 3 deletions
diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index fc30eed10983..2ea706613ef8 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -67,15 +67,14 @@ public final class PermissionManager { * such an old app asks for a location permission (i.e. the * {@link SplitPermissionInfo#getSplitPermission()}), then the * {@link Manifest.permission#ACCESS_BACKGROUND_LOCATION} permission (inside - * {@{@link SplitPermissionInfo#getNewPermissions}) is added. + * {@link SplitPermissionInfo#getNewPermissions}) is added. * * <p>Note: Regular apps do not have to worry about this. The platform and permission controller * automatically add the new permissions where needed. * * @return All permissions that are split. */ - public @NonNull - List<SplitPermissionInfo> getSplitPermissions() { + public @NonNull List<SplitPermissionInfo> getSplitPermissions() { return SPLIT_PERMISSIONS; } diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java index f0230fcb91df..d52bd640977f 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -152,6 +152,13 @@ public class PermissionManagerService { @GuardedBy("mLock") private boolean mSystemReady; + /** + * For each foreground/background permission the mapping: + * Background permission -> foreground permissions + */ + @GuardedBy("mLock") + private ArrayMap<String, List<String>> mBackgroundPermissions; + PermissionManagerService(Context context, @Nullable DefaultPermissionGrantedCallback defaultGrantCallback, @NonNull Object externalLock) { @@ -1770,6 +1777,28 @@ public class PermissionManagerService { // and make sure there are no dangling permissions. flags = updatePermissions(changingPkgName, changingPkg, flags); + synchronized (mLock) { + if (mBackgroundPermissions == null) { + // Cache background -> foreground permission mapping. + // Only system declares background permissions, hence mapping does never change. + mBackgroundPermissions = new ArrayMap<>(); + for (BasePermission bp : mSettings.getAllPermissionsLocked()) { + if (bp.perm.info != null && bp.perm.info.backgroundPermission != null) { + String fgPerm = bp.name; + String bgPerm = bp.perm.info.backgroundPermission; + + List<String> fgPerms = mBackgroundPermissions.get(bgPerm); + if (fgPerms == null) { + fgPerms = new ArrayList<>(); + mBackgroundPermissions.put(bgPerm, fgPerms); + } + + fgPerms.add(fgPerm); + } + } + } + } + Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "restorePermissionState"); // Now update the permissions for all packages, in particular // replace the granted permissions of the system packages. @@ -2087,6 +2116,17 @@ public class PermissionManagerService { mMetricsLogger.write(log); } + /** + * Get the mapping of background permissions to their foreground permissions. + * + * <p>Only initialized in the system server. + * + * @return the map <bg permission -> list<fg perm>> + */ + public @Nullable ArrayMap<String, List<String>> getBackgroundPermissions() { + return mBackgroundPermissions; + } + private class PermissionManagerInternalImpl extends PermissionManagerInternal { @Override public void systemReady() { |