Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8c7b307f authored by Kevin Han's avatar Kevin Han Committed by Android (Google) Code Review
Browse files

Merge "Add unused count API"

parents ab2d473f f2334764
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
@@ -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>);
+2 −0
Original line number Diff line number Diff line
@@ -54,4 +54,6 @@ oneway interface IPermissionController {
    void getGroupOfPlatformPermission(
            in String permissionName,
            in AndroidFuture<String> callback);
    void getUnusedAppCount(
            in AndroidFuture callback);
}
+31 −0
Original line number Diff line number Diff line
@@ -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.
@@ -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);
                }
            }
        });
    }
}
+28 −0
Original line number Diff line number Diff line
@@ -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() {
@@ -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);
                }
            }
        };
    }
}