From 93e38c9566bd555804bd28688baa87e8eff70876 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Fri, 4 Dec 2020 09:31:28 -0800 Subject: [PATCH] Move or refactor PermissionManagerInternal APIs. Make the three backup related methods in PermissionManagerInternal ready for system API. PermissionManagerInternal is currently used in framework so it can't be removed without other changes yet. The other listener methods are only used by PermissionPolicyService and will become module internal. Finally turn PermissionManagerInternal and PermissionManagerServiceInternal into an interface from an abstract class, and remove redundant modifiers after this. Also refactors onUserCreated/Removed() to be system API ready. Bug: 158736025 Test: presubmit Change-Id: I335a7a37b737f6fa0faf0a2c34634d44199aee97 --- .../permission/PermissionManagerInternal.java | 69 +++----- .../server/backup/PermissionBackupHelper.java | 10 +- .../server/pm/PackageManagerService.java | 7 +- .../permission/PermissionManagerService.java | 58 ++++--- .../PermissionManagerServiceInternal.java | 152 +++++++++++------- 5 files changed, 155 insertions(+), 141 deletions(-) diff --git a/core/java/android/permission/PermissionManagerInternal.java b/core/java/android/permission/PermissionManagerInternal.java index 71674311965ce..a4676c47bac39 100644 --- a/core/java/android/permission/PermissionManagerInternal.java +++ b/core/java/android/permission/PermissionManagerInternal.java @@ -19,7 +19,6 @@ package android.permission; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; -import android.os.UserHandle; /** * Internal interfaces to be used by other components within the system server. @@ -28,69 +27,39 @@ import android.os.UserHandle; * * @hide */ -public abstract class PermissionManagerInternal { - +public interface PermissionManagerInternal { /** - * Listener for package permission state (permissions or flags) changes. - */ - public interface OnRuntimePermissionStateChangedListener { - - /** - * Called when the runtime permission state (permissions or flags) changed. - * - * @param packageName The package for which the change happened. - * @param userId the user id for which the change happened. - */ - @Nullable - void onRuntimePermissionStateChanged(@NonNull String packageName, - @UserIdInt int userId); - } - - /** - * Get the state of the runtime permissions as xml file. + * Get the state of the runtime permissions as a blob. * - * @param user The user the data should be extracted for + * @param userId The user ID the data should be extracted for * - * @return The state as a xml file + * @return the state as a blob */ - public abstract @Nullable byte[] backupRuntimePermissions(@NonNull UserHandle user); + //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) + @Nullable + byte[] backupRuntimePermissions(@UserIdInt int userId); /** * Restore a permission state previously backed up via {@link #backupRuntimePermissions}. + *

+ * If not all state can be restored, the un-restorable state will be delayed and can be + * retried via {@link #restoreDelayedRuntimePermissions}. * - *

If not all state can be restored, the un-restoreable state will be delayed and can be - * re-tried via {@link #restoreDelayedRuntimePermissions}. - * - * @param backup The state as an xml file - * @param user The user the data should be restored for + * @param backup the state as a blob + * @param userId the user ID the data should be restored for */ - public abstract void restoreRuntimePermissions(@NonNull byte[] backup, - @NonNull UserHandle user); + //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) + void restoreRuntimePermissions(@NonNull byte[] backup, @UserIdInt int userId); /** * Try to apply permission backup of a package that was previously not applied. * - * @param packageName The package that is newly installed - * @param user The user the package is installed for + * @param packageName the package that is newly installed + * @param userId the user ID the package is installed for * * @see #restoreRuntimePermissions */ - public abstract void restoreDelayedRuntimePermissions(@NonNull String packageName, - @NonNull UserHandle user); - - /** - * Adds a listener for runtime permission state (permissions or flags) changes. - * - * @param listener The listener. - */ - public abstract void addOnRuntimePermissionStateChangedListener( - @NonNull OnRuntimePermissionStateChangedListener listener); - - /** - * Removes a listener for runtime permission state (permissions or flags) changes. - * - * @param listener The listener. - */ - public abstract void removeOnRuntimePermissionStateChangedListener( - @NonNull OnRuntimePermissionStateChangedListener listener); + //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) + void restoreDelayedRuntimePermissions(@NonNull String packageName, + @UserIdInt int userId); } diff --git a/core/java/com/android/server/backup/PermissionBackupHelper.java b/core/java/com/android/server/backup/PermissionBackupHelper.java index c7c423b82cf1d..4d1949e3e3d7b 100644 --- a/core/java/com/android/server/backup/PermissionBackupHelper.java +++ b/core/java/com/android/server/backup/PermissionBackupHelper.java @@ -17,8 +17,8 @@ package com.android.server.backup; import android.annotation.NonNull; +import android.annotation.UserIdInt; import android.app.backup.BlobBackupHelper; -import android.os.UserHandle; import android.permission.PermissionManagerInternal; import android.util.Slog; @@ -34,14 +34,14 @@ public class PermissionBackupHelper extends BlobBackupHelper { // key under which the permission-grant state blob is committed to backup private static final String KEY_PERMISSIONS = "permissions"; - private final @NonNull UserHandle mUser; + private final @UserIdInt int mUserId; private final @NonNull PermissionManagerInternal mPermissionManager; public PermissionBackupHelper(int userId) { super(STATE_VERSION, KEY_PERMISSIONS); - mUser = UserHandle.of(userId); + mUserId = userId; mPermissionManager = LocalServices.getService(PermissionManagerInternal.class); } @@ -53,7 +53,7 @@ public class PermissionBackupHelper extends BlobBackupHelper { try { switch (key) { case KEY_PERMISSIONS: - return mPermissionManager.backupRuntimePermissions(mUser); + return mPermissionManager.backupRuntimePermissions(mUserId); default: Slog.w(TAG, "Unexpected backup key " + key); @@ -72,7 +72,7 @@ public class PermissionBackupHelper extends BlobBackupHelper { try { switch (key) { case KEY_PERMISSIONS: - mPermissionManager.restoreRuntimePermissions(payload, mUser); + mPermissionManager.restoreRuntimePermissions(payload, mUserId); break; default: diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6aa4589cad98a..91b41f87c0ad2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -20723,8 +20723,7 @@ public class PackageManagerService extends IPackageManager.Stub // We may also need to apply pending (restored) runtime permission grants // within these users. - mPermissionManager.restoreDelayedRuntimePermissions(packageName, - UserHandle.of(userId)); + mPermissionManager.restoreDelayedRuntimePermissions(packageName, userId); // Persistent preferred activity might have came into effect due to this // install. @@ -24333,13 +24332,13 @@ public class PackageManagerService extends IPackageManager.Stub + ", convertedFromPreCreated=" + convertedFromPreCreated + ")"); } if (!convertedFromPreCreated) { - mPermissionManager.onNewUserCreated(userId); + mPermissionManager.onUserCreated(userId); return; } if (!readPermissionStateForUser(userId)) { // Could not read the existing permissions, re-grant them. Slog.i(TAG, "re-granting permissions for pre-created user " + userId); - mPermissionManager.onNewUserCreated(userId); + mPermissionManager.onUserCreated(userId); } } 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 7ed887d9680aa..4847504abd417 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerService.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerService.java @@ -114,7 +114,6 @@ import android.permission.IPermissionManager; import android.permission.PermissionControllerManager; import android.permission.PermissionManager; import android.permission.PermissionManagerInternal; -import android.permission.PermissionManagerInternal.OnRuntimePermissionStateChangedListener; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -151,6 +150,7 @@ import com.android.server.pm.UserManagerInternal; import com.android.server.pm.UserManagerService; import com.android.server.pm.parsing.PackageInfoUtils; import com.android.server.pm.parsing.pkg.AndroidPackage; +import com.android.server.pm.permission.PermissionManagerServiceInternal.OnRuntimePermissionStateChangedListener; import com.android.server.policy.PermissionPolicyInternal; import com.android.server.policy.SoftRestrictedPermissionPolicy; @@ -2197,19 +2197,20 @@ public class PermissionManagerService extends IPermissionManager.Stub { * *

Can not be called on main thread. * - * @param user The user the data should be extracted for + * @param userId The user ID the data should be extracted for * * @return The state as a xml file */ - private @Nullable byte[] backupRuntimePermissions(@NonNull UserHandle user) { + @Nullable + private byte[] backupRuntimePermissions(@UserIdInt int userId) { CompletableFuture backup = new CompletableFuture<>(); - mPermissionControllerManager.getRuntimePermissionBackup(user, mContext.getMainExecutor(), - backup::complete); + mPermissionControllerManager.getRuntimePermissionBackup(UserHandle.of(userId), + mContext.getMainExecutor(), backup::complete); try { return backup.get(BACKUP_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS); } catch (InterruptedException | ExecutionException | TimeoutException e) { - Slog.e(TAG, "Cannot create permission backup for " + user, e); + Slog.e(TAG, "Cannot create permission backup for user " + userId, e); return null; } } @@ -2221,13 +2222,14 @@ public class PermissionManagerService extends IPermissionManager.Stub { * applied via {@link #restoreDelayedRuntimePermissions}. * * @param backup The state as an xml file - * @param user The user the data should be restored for + * @param userId The user ID the data should be restored for */ - private void restoreRuntimePermissions(@NonNull byte[] backup, @NonNull UserHandle user) { + private void restoreRuntimePermissions(@NonNull byte[] backup, @UserIdInt int userId) { synchronized (mLock) { - mHasNoDelayedPermBackup.delete(user.getIdentifier()); + mHasNoDelayedPermBackup.delete(userId); } - mPermissionControllerManager.stageAndApplyRuntimePermissionsBackup(backup, user); + mPermissionControllerManager.stageAndApplyRuntimePermissionsBackup(backup, + UserHandle.of(userId)); } /** @@ -2236,24 +2238,24 @@ public class PermissionManagerService extends IPermissionManager.Stub { *

Can not be called on main thread. * * @param packageName The package that is newly installed - * @param user The user the package is installed for + * @param userId The user ID the package is installed for * * @see #restoreRuntimePermissions */ private void restoreDelayedRuntimePermissions(@NonNull String packageName, - @NonNull UserHandle user) { + @UserIdInt int userId) { synchronized (mLock) { - if (mHasNoDelayedPermBackup.get(user.getIdentifier(), false)) { + if (mHasNoDelayedPermBackup.get(userId, false)) { return; } } - mPermissionControllerManager.applyStagedRuntimePermissionBackup(packageName, user, - mContext.getMainExecutor(), (hasMoreBackup) -> { + mPermissionControllerManager.applyStagedRuntimePermissionBackup(packageName, + UserHandle.of(userId), mContext.getMainExecutor(), (hasMoreBackup) -> { if (hasMoreBackup) { return; } synchronized (mLock) { - mHasNoDelayedPermBackup.put(user.getIdentifier(), true); + mHasNoDelayedPermBackup.put(userId, true); } }); } @@ -5058,7 +5060,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { } } - private class PermissionManagerServiceInternalImpl extends PermissionManagerServiceInternal { + private class PermissionManagerServiceInternalImpl implements PermissionManagerServiceInternal { @Override public void systemReady() { PermissionManagerService.this.systemReady(); @@ -5083,6 +5085,7 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @Override public void onUserRemoved(@UserIdInt int userId) { + Preconditions.checkArgumentNonNegative(userId, "userId"); PermissionManagerService.this.onUserRemoved(userId); } @NonNull @@ -5162,20 +5165,26 @@ public class PermissionManagerService extends IPermissionManager.Stub { return matchingPermissions; } + @Nullable @Override - public @Nullable byte[] backupRuntimePermissions(@NonNull UserHandle user) { - return PermissionManagerService.this.backupRuntimePermissions(user); + public byte[] backupRuntimePermissions(@UserIdInt int userId) { + Preconditions.checkArgumentNonNegative(userId, "userId"); + return PermissionManagerService.this.backupRuntimePermissions(userId); } @Override - public void restoreRuntimePermissions(@NonNull byte[] backup, @NonNull UserHandle user) { - PermissionManagerService.this.restoreRuntimePermissions(backup, user); + public void restoreRuntimePermissions(@NonNull byte[] backup, @UserIdInt int userId) { + Objects.requireNonNull(backup, "backup"); + Preconditions.checkArgumentNonNegative(userId, "userId"); + PermissionManagerService.this.restoreRuntimePermissions(backup, userId); } @Override public void restoreDelayedRuntimePermissions(@NonNull String packageName, - @NonNull UserHandle user) { - PermissionManagerService.this.restoreDelayedRuntimePermissions(packageName, user); + @UserIdInt int userId) { + Objects.requireNonNull(packageName, "packageName"); + Preconditions.checkArgumentNonNegative(userId, "userId"); + PermissionManagerService.this.restoreDelayedRuntimePermissions(packageName, userId); } @Override @@ -5264,7 +5273,8 @@ public class PermissionManagerService extends IPermissionManager.Stub { } @Override - public void onNewUserCreated(int userId) { + public void onUserCreated(@UserIdInt int userId) { + Preconditions.checkArgumentNonNegative(userId, "userId"); // NOTE: This adds UPDATE_PERMISSIONS_REPLACE_PKG PermissionManagerService.this.updateAllPermissions(StorageManager.UUID_PRIVATE_INTERNAL, true, mDefaultPermissionCallback); diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java index e006fa784cce9..1163ce0ac9178 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInternal.java @@ -34,14 +34,14 @@ import java.util.Set; /** * Internal interfaces services. * - * TODO: Should be merged into PermissionManagerInternal, but currently uses internal classes. + * TODO: Move into module. */ -public abstract class PermissionManagerServiceInternal extends PermissionManagerInternal - implements LegacyPermissionDataProvider { +public interface PermissionManagerServiceInternal extends PermissionManagerInternal, + LegacyPermissionDataProvider { /** * Provider for package names. */ - public interface PackagesProvider { + interface PackagesProvider { /** * Gets the packages for a given user. @@ -54,7 +54,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager /** * Provider for package names. */ - public interface SyncAdapterPackagesProvider { + interface SyncAdapterPackagesProvider { /** * Gets the sync adapter packages for given authority and user. @@ -65,7 +65,23 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager String[] getPackages(String authority, int userId); } - public abstract void systemReady(); + /** + * Adds a listener for runtime permission state (permissions or flags) changes. + * + * @param listener The listener. + */ + void addOnRuntimePermissionStateChangedListener( + @NonNull OnRuntimePermissionStateChangedListener listener); + + /** + * Removes a listener for runtime permission state (permissions or flags) changes. + * + * @param listener The listener. + */ + void removeOnRuntimePermissionStateChangedListener( + @NonNull OnRuntimePermissionStateChangedListener listener); + + void systemReady(); /** * Get whether permission review is required for a package. @@ -75,7 +91,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @return whether permission review is required */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract boolean isPermissionsReviewRequired(@NonNull String packageName, + boolean isPermissionsReviewRequired(@NonNull String packageName, @UserIdInt int userId); /** @@ -90,7 +106,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param allPackages All currently known packages * @param callback Callback to call after permission changes */ - public abstract void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdate); + void updateAllPermissions(@Nullable String volumeUuid, boolean sdkUpdate); /** * Reset the runtime permission state changes for a package. @@ -101,7 +117,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param userId the user ID */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void resetRuntimePermissions(@NonNull AndroidPackage pkg, + void resetRuntimePermissions(@NonNull AndroidPackage pkg, @UserIdInt int userId); /** @@ -110,7 +126,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param userId the user ID */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void resetAllRuntimePermissions(@UserIdInt int userId); + void resetAllRuntimePermissions(@UserIdInt int userId); /** * Read legacy permission state from package settings. @@ -119,7 +135,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * {@code PackageSetting} which is a implementation detail that permission should not know. * Instead, it should retrieve the legacy state via a defined API. */ - public abstract void readLegacyPermissionStateTEMP(); + void readLegacyPermissionStateTEMP(); /** * Write legacy permission state to package settings. @@ -127,12 +143,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * TODO(zhanghai): This is a temporary method and should be removed once we migrated persistence * for permission. */ - public abstract void writeLegacyPermissionStateTEMP(); - - /** - * Notify that a user has been removed and its permission state should be removed as well. - */ - public abstract void onUserRemoved(@UserIdInt int userId); + void writeLegacyPermissionStateTEMP(); /** * Get all the permissions granted to a package. @@ -143,8 +154,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) @NonNull - public abstract Set getGrantedPermissions(@NonNull String packageName, - @UserIdInt int userId); + Set getGrantedPermissions(@NonNull String packageName, @UserIdInt int userId); /** * Get the GIDs of a permission. @@ -155,7 +165,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) @NonNull - public abstract int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId); + int[] getPermissionGids(@NonNull String permissionName, @UserIdInt int userId); /** * Get the packages that have requested an app op permission. @@ -165,18 +175,19 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) @NonNull - public abstract String[] getAppOpPermissionPackages(@NonNull String permissionName); + String[] getAppOpPermissionPackages(@NonNull String permissionName); /** HACK HACK methods to allow for partial migration of data to the PermissionManager class */ @Nullable - public abstract Permission getPermissionTEMP(@NonNull String permName); + Permission getPermissionTEMP(@NonNull String permName); /** Get all permissions that have a certain protection */ - public abstract @NonNull ArrayList getAllPermissionsWithProtection( + @NonNull + ArrayList getAllPermissionsWithProtection( @PermissionInfo.Protection int protection); /** Get all permissions that have certain protection flags */ - public abstract @NonNull ArrayList getAllPermissionsWithProtectionFlags( + @NonNull ArrayList getAllPermissionsWithProtectionFlags( @PermissionInfo.ProtectionFlags int protectionFlags); /** @@ -188,7 +199,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * for, or {@code null} for all permissions */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void startShellPermissionIdentityDelegation(int uid, + void startShellPermissionIdentityDelegation(int uid, @NonNull String packageName, @Nullable List permissionNames); /** @@ -197,89 +208,85 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @see #startShellPermissionIdentityDelegation(int, String, List) */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void stopShellPermissionIdentityDelegation(); + void stopShellPermissionIdentityDelegation(); /** * Sets the dialer application packages provider. * @param provider The provider. */ - public abstract void setDialerAppPackagesProvider(PackagesProvider provider); + void setDialerAppPackagesProvider(PackagesProvider provider); /** * Set the location extra packages provider. * @param provider The packages provider. */ - public abstract void setLocationExtraPackagesProvider(PackagesProvider provider); + void setLocationExtraPackagesProvider(PackagesProvider provider); /** * Sets the location provider packages provider. * @param provider The packages provider. */ - public abstract void setLocationPackagesProvider(PackagesProvider provider); + void setLocationPackagesProvider(PackagesProvider provider); /** * Sets the SIM call manager packages provider. * @param provider The provider. */ - public abstract void setSimCallManagerPackagesProvider(PackagesProvider provider); + void setSimCallManagerPackagesProvider(PackagesProvider provider); /** * Sets the SMS application packages provider. * @param provider The provider. */ - public abstract void setSmsAppPackagesProvider(PackagesProvider provider); + void setSmsAppPackagesProvider(PackagesProvider provider); /** * Sets the sync adapter packages provider. * @param provider The provider. */ - public abstract void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider); + void setSyncAdapterPackagesProvider(SyncAdapterPackagesProvider provider); /** * Sets the Use Open Wifi packages provider. * @param provider The packages provider. */ - public abstract void setUseOpenWifiAppPackagesProvider(PackagesProvider provider); + void setUseOpenWifiAppPackagesProvider(PackagesProvider provider); /** * Sets the voice interaction packages provider. * @param provider The packages provider. */ - public abstract void setVoiceInteractionPackagesProvider(PackagesProvider provider); + void setVoiceInteractionPackagesProvider(PackagesProvider provider); /** * Requests granting of the default permissions to the current default browser. * @param packageName The default browser package name. * @param userId The user for which to grant the permissions. */ - public abstract void grantDefaultPermissionsToDefaultBrowser( - @NonNull String packageName, @UserIdInt int userId); + void grantDefaultPermissionsToDefaultBrowser(@NonNull String packageName, + @UserIdInt int userId); /** * Requests granting of the default permissions to the current default Use Open Wifi app. * @param packageName The default use open wifi package name. * @param userId The user for which to grant the permissions. */ - public abstract void grantDefaultPermissionsToDefaultSimCallManager( - @NonNull String packageName, @UserIdInt int userId); + void grantDefaultPermissionsToDefaultSimCallManager(@NonNull String packageName, + @UserIdInt int userId); /** * Requests granting of the default permissions to the current default Use Open Wifi app. * @param packageName The default use open wifi package name. * @param userId The user for which to grant the permissions. */ - public abstract void grantDefaultPermissionsToDefaultUseOpenWifiApp( - @NonNull String packageName, @UserIdInt int userId); - - /** Called when a new user has been created. */ - public abstract void onNewUserCreated(@UserIdInt int userId); + void grantDefaultPermissionsToDefaultUseOpenWifiApp(@NonNull String packageName, + @UserIdInt int userId); /** * Removes invalid permissions which are not {@link PermissionInfo#FLAG_HARD_RESTRICTED} or * {@link PermissionInfo#FLAG_SOFT_RESTRICTED} from the input. */ - public abstract void retainHardAndSoftRestrictedPermissions( - @NonNull List permissionNames); + void retainHardAndSoftRestrictedPermissions(@NonNull List permissionNames); /** * Read legacy permissions from legacy permission settings. @@ -288,8 +295,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * {@code LegacyPermissionSettings} which is a implementation detail that permission should not * know. Instead, it should retrieve the legacy permissions via a defined API. */ - public abstract void readLegacyPermissionsTEMP( - @NonNull LegacyPermissionSettings legacyPermissionSettings); + void readLegacyPermissionsTEMP(@NonNull LegacyPermissionSettings legacyPermissionSettings); /** * Write legacy permissions to legacy permission settings. @@ -297,8 +303,23 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * TODO(zhanghai): This is a temporary method and should be removed once we migrated persistence * for permission. */ - public abstract void writeLegacyPermissionsTEMP( - @NonNull LegacyPermissionSettings legacyPermissionSettings); + void writeLegacyPermissionsTEMP(@NonNull LegacyPermissionSettings legacyPermissionSettings); + + /** + * Callback when a user has been created. + * + * @param userId the created user ID + */ + //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) + void onUserCreated(@UserIdInt int userId); + + /** + * Callback when a user has been removed. + * + * @param userId the removed user ID + */ + //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) + void onUserRemoved(@UserIdInt int userId); /** * Callback when a package has been added. @@ -308,7 +329,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param oldPkg the old package, or {@code null} if none */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void onPackageAdded(@NonNull AndroidPackage pkg, boolean isInstantApp, + void onPackageAdded(@NonNull AndroidPackage pkg, boolean isInstantApp, @Nullable AndroidPackage oldPkg); /** @@ -319,8 +340,8 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param userId the user ID this package is installed for */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void onPackageInstalled(@NonNull AndroidPackage pkg, - @NonNull PackageInstalledParams params, @UserIdInt int userId); + void onPackageInstalled(@NonNull AndroidPackage pkg, @NonNull PackageInstalledParams params, + @UserIdInt int userId); /** * Callback when a package has been removed. @@ -328,7 +349,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param pkg the removed package */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void onPackageRemoved(@NonNull AndroidPackage pkg); + void onPackageRemoved(@NonNull AndroidPackage pkg); /** * Callback when a package has been uninstalled. @@ -345,9 +366,8 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param userId the user ID the package is uninstalled for */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public abstract void onPackageUninstalled(@NonNull String packageName, int appId, - @Nullable AndroidPackage pkg, @NonNull List sharedUserPkgs, - @UserIdInt int userId); + void onPackageUninstalled(@NonNull String packageName, int appId, @Nullable AndroidPackage pkg, + @NonNull List sharedUserPkgs, @UserIdInt int userId); /** * Check whether a permission can be propagated to instant app. @@ -355,7 +375,23 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @param permissionName the name of the permission * @return whether the permission can be propagated */ - public abstract boolean canPropagatePermissionToInstantApp(@NonNull String permissionName); + boolean canPropagatePermissionToInstantApp(@NonNull String permissionName); + + /** + * Listener for package permission state (permissions or flags) changes. + */ + interface OnRuntimePermissionStateChangedListener { + + /** + * Called when the runtime permission state (permissions or flags) changed. + * + * @param packageName The package for which the change happened. + * @param userId the user id for which the change happened. + */ + @Nullable + void onRuntimePermissionStateChanged(@NonNull String packageName, + @UserIdInt int userId); + } /** * The permission-related parameters passed in for package installation. @@ -363,7 +399,7 @@ public abstract class PermissionManagerServiceInternal extends PermissionManager * @see android.content.pm.PackageInstaller.SessionParams */ //@SystemApi(client = SystemApi.Client.SYSTEM_SERVER) - public static final class PackageInstalledParams { + final class PackageInstalledParams { /** * A static instance whose parameters are all in their default state. */