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. */