Loading core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -9540,6 +9540,7 @@ package android.permission { public final class PermissionControllerManager { method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>); method public void getUnusedAppCount(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer); method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback); method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle); field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1 Loading @@ -9564,6 +9565,7 @@ package android.permission { method @BinderThread public abstract void onGetPermissionUsages(boolean, long, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionUsageInfo>>); method @BinderThread public void onGetPlatformPermissionsForGroup(@NonNull String, @NonNull java.util.function.Consumer<java.util.List<java.lang.String>>); method @BinderThread public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream, @NonNull Runnable); method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_APP_HIBERNATION) public void onGetUnusedAppCount(@NonNull java.util.function.IntConsumer); method @BinderThread public abstract void onGrantOrUpgradeDefaultRuntimePermissions(@NonNull Runnable); method @BinderThread public void onOneTimePermissionSessionTimeout(@NonNull String); method @Deprecated @BinderThread public void onRestoreDelayedRuntimePermissionsBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.function.Consumer<java.lang.Boolean>); core/java/android/permission/IPermissionController.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -54,4 +54,6 @@ oneway interface IPermissionController { void getGroupOfPlatformPermission( in String permissionName, in AndroidFuture<String> callback); void getUnusedAppCount( in AndroidFuture callback); } core/java/android/permission/PermissionControllerManager.java +31 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import java.util.Objects; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.IntConsumer; /** * Interface for communicating with the permission controller. Loading Loading @@ -786,4 +787,34 @@ public final class PermissionControllerManager { } }, executor); } /** * Get the number of unused, hibernating apps for the user. * * @param executor executor to run callback on * @param callback callback for when result is generated */ public void getUnusedAppCount(@NonNull @CallbackExecutor Executor executor, @NonNull IntConsumer callback) { checkNotNull(executor); checkNotNull(callback); mRemoteService.postAsync(service -> { AndroidFuture<Integer> unusedAppCountResult = new AndroidFuture<>(); service.getUnusedAppCount(unusedAppCountResult); return unusedAppCountResult; }).whenCompleteAsync((count, err) -> { if (err != null) { Log.e(TAG, "Error getting unused app count", err); callback.accept(0); } else { final long token = Binder.clearCallingIdentity(); try { callback.accept((int) count); } finally { Binder.restoreCallingIdentity(token); } } }); } } core/java/android/permission/PermissionControllerService.java +28 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,20 @@ public abstract class PermissionControllerService extends Service { throw new AbstractMethodError("Must be overridden in implementing class"); } /** * Get the count of unused, hibernating apps on the device. * * @param callback callback after count is retrieved * * @hide */ @SystemApi @RequiresPermission(Manifest.permission.MANAGE_APP_HIBERNATION) @NonNull public void onGetUnusedAppCount(@NonNull IntConsumer callback) { throw new AbstractMethodError("Must be overridden in implementing class"); } @Override public final @NonNull IBinder onBind(Intent intent) { return new IPermissionController.Stub() { Loading Loading @@ -618,6 +632,20 @@ public abstract class PermissionControllerService extends Service { callback.completeExceptionally(t); } } @Override public void getUnusedAppCount(@NonNull AndroidFuture callback) { try { Objects.requireNonNull(callback); enforceSomePermissionsGrantedToCaller( Manifest.permission.MANAGE_APP_HIBERNATION); PermissionControllerService.this.onGetUnusedAppCount(callback::complete); } catch (Throwable t) { callback.completeExceptionally(t); } } }; } } Loading
core/api/system-current.txt +2 −0 Original line number Diff line number Diff line Loading @@ -9540,6 +9540,7 @@ package android.permission { public final class PermissionControllerManager { method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void applyStagedRuntimePermissionBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<java.lang.Boolean>); method @RequiresPermission(android.Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getRuntimePermissionBackup(@NonNull android.os.UserHandle, @NonNull java.util.concurrent.Executor, @NonNull java.util.function.Consumer<byte[]>); method public void getUnusedAppCount(@NonNull java.util.concurrent.Executor, @NonNull java.util.function.IntConsumer); method @RequiresPermission(android.Manifest.permission.REVOKE_RUNTIME_PERMISSIONS) public void revokeRuntimePermissions(@NonNull java.util.Map<java.lang.String,java.util.List<java.lang.String>>, boolean, int, @NonNull java.util.concurrent.Executor, @NonNull android.permission.PermissionControllerManager.OnRevokeRuntimePermissionsCallback); method @RequiresPermission(anyOf={android.Manifest.permission.GRANT_RUNTIME_PERMISSIONS, android.Manifest.permission.RESTORE_RUNTIME_PERMISSIONS}) public void stageAndApplyRuntimePermissionsBackup(@NonNull byte[], @NonNull android.os.UserHandle); field public static final int COUNT_ONLY_WHEN_GRANTED = 1; // 0x1 Loading @@ -9564,6 +9565,7 @@ package android.permission { method @BinderThread public abstract void onGetPermissionUsages(boolean, long, @NonNull java.util.function.Consumer<java.util.List<android.permission.RuntimePermissionUsageInfo>>); method @BinderThread public void onGetPlatformPermissionsForGroup(@NonNull String, @NonNull java.util.function.Consumer<java.util.List<java.lang.String>>); method @BinderThread public abstract void onGetRuntimePermissionsBackup(@NonNull android.os.UserHandle, @NonNull java.io.OutputStream, @NonNull Runnable); method @NonNull @RequiresPermission(android.Manifest.permission.MANAGE_APP_HIBERNATION) public void onGetUnusedAppCount(@NonNull java.util.function.IntConsumer); method @BinderThread public abstract void onGrantOrUpgradeDefaultRuntimePermissions(@NonNull Runnable); method @BinderThread public void onOneTimePermissionSessionTimeout(@NonNull String); method @Deprecated @BinderThread public void onRestoreDelayedRuntimePermissionsBackup(@NonNull String, @NonNull android.os.UserHandle, @NonNull java.util.function.Consumer<java.lang.Boolean>);
core/java/android/permission/IPermissionController.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -54,4 +54,6 @@ oneway interface IPermissionController { void getGroupOfPlatformPermission( in String permissionName, in AndroidFuture<String> callback); void getUnusedAppCount( in AndroidFuture callback); }
core/java/android/permission/PermissionControllerManager.java +31 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,7 @@ import java.util.Objects; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; import java.util.function.IntConsumer; /** * Interface for communicating with the permission controller. Loading Loading @@ -786,4 +787,34 @@ public final class PermissionControllerManager { } }, executor); } /** * Get the number of unused, hibernating apps for the user. * * @param executor executor to run callback on * @param callback callback for when result is generated */ public void getUnusedAppCount(@NonNull @CallbackExecutor Executor executor, @NonNull IntConsumer callback) { checkNotNull(executor); checkNotNull(callback); mRemoteService.postAsync(service -> { AndroidFuture<Integer> unusedAppCountResult = new AndroidFuture<>(); service.getUnusedAppCount(unusedAppCountResult); return unusedAppCountResult; }).whenCompleteAsync((count, err) -> { if (err != null) { Log.e(TAG, "Error getting unused app count", err); callback.accept(0); } else { final long token = Binder.clearCallingIdentity(); try { callback.accept((int) count); } finally { Binder.restoreCallingIdentity(token); } } }); } }
core/java/android/permission/PermissionControllerService.java +28 −0 Original line number Diff line number Diff line Loading @@ -340,6 +340,20 @@ public abstract class PermissionControllerService extends Service { throw new AbstractMethodError("Must be overridden in implementing class"); } /** * Get the count of unused, hibernating apps on the device. * * @param callback callback after count is retrieved * * @hide */ @SystemApi @RequiresPermission(Manifest.permission.MANAGE_APP_HIBERNATION) @NonNull public void onGetUnusedAppCount(@NonNull IntConsumer callback) { throw new AbstractMethodError("Must be overridden in implementing class"); } @Override public final @NonNull IBinder onBind(Intent intent) { return new IPermissionController.Stub() { Loading Loading @@ -618,6 +632,20 @@ public abstract class PermissionControllerService extends Service { callback.completeExceptionally(t); } } @Override public void getUnusedAppCount(@NonNull AndroidFuture callback) { try { Objects.requireNonNull(callback); enforceSomePermissionsGrantedToCaller( Manifest.permission.MANAGE_APP_HIBERNATION); PermissionControllerService.this.onGetUnusedAppCount(callback::complete); } catch (Throwable t) { callback.completeExceptionally(t); } } }; } }