summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorPhilip P. Moltmann <moltmann@google.com>2018-12-11 03:14:16 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2018-12-11 03:14:16 +0000
commitbbe5d429c7e2b1da967b2ee376c5ac2896e9269d (patch)
treedc6652ebe0011f81209e646fb4e0e2ec2a751885 /core/java
parent55efdbc2b3f58d5a49670e9a1c90de9e846ce7ec (diff)
parent08cac8e486816b482133d02e632ab87e38b51bad (diff)
Merge "Add new method to count how many apps have permissions"
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/permission/IRuntimePermissionPresenter.aidl2
-rw-r--r--core/java/android/permission/RuntimePermissionPresenter.java84
-rw-r--r--core/java/android/permission/RuntimePermissionPresenterService.java35
3 files changed, 116 insertions, 5 deletions
diff --git a/core/java/android/permission/IRuntimePermissionPresenter.aidl b/core/java/android/permission/IRuntimePermissionPresenter.aidl
index 693d21b07513..e95428ab2b02 100644
--- a/core/java/android/permission/IRuntimePermissionPresenter.aidl
+++ b/core/java/android/permission/IRuntimePermissionPresenter.aidl
@@ -26,4 +26,6 @@ import android.os.RemoteCallback;
oneway interface IRuntimePermissionPresenter {
void getAppPermissions(String packageName, in RemoteCallback callback);
void revokeRuntimePermission(String packageName, String permissionName);
+ void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted,
+ boolean countSystem, in RemoteCallback callback);
}
diff --git a/core/java/android/permission/RuntimePermissionPresenter.java b/core/java/android/permission/RuntimePermissionPresenter.java
index ed9165e7ff87..3ce3c9db2623 100644
--- a/core/java/android/permission/RuntimePermissionPresenter.java
+++ b/core/java/android/permission/RuntimePermissionPresenter.java
@@ -16,6 +16,7 @@
package android.permission;
+import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -62,16 +63,31 @@ public final class RuntimePermissionPresenter {
"android.permission.RuntimePermissionPresenter.key.result";
/**
- * Listener for delivering a result.
+ * Listener for delivering the result of {@link #getAppPermissions}.
*/
- public interface OnResultCallback {
+ public interface OnGetAppPermissionResultCallback {
/**
- * The result for {@link #getAppPermissions(String, OnResultCallback, Handler)}.
+ * The result for {@link #getAppPermissions(String, OnGetAppPermissionResultCallback,
+ * Handler)}.
+ *
* @param permissions The permissions list.
*/
void onGetAppPermissions(@NonNull List<RuntimePermissionPresentationInfo> permissions);
}
+ /**
+ * Listener for delivering the result of {@link #countPermissionApps}.
+ */
+ public interface OnCountPermissionAppsResultCallback {
+ /**
+ * The result for {@link #countPermissionApps(List, boolean,
+ * OnCountPermissionAppsResultCallback, Handler)}.
+ *
+ * @param numApps The number of apps that have one of the permissions
+ */
+ void onCountPermissionApps(int numApps);
+ }
+
private static final Object sLock = new Object();
@GuardedBy("sLock")
@@ -106,7 +122,7 @@ public final class RuntimePermissionPresenter {
* @param handler Handler on which to invoke the callback.
*/
public void getAppPermissions(@NonNull String packageName,
- @NonNull OnResultCallback callback, @Nullable Handler handler) {
+ @NonNull OnGetAppPermissionResultCallback callback, @Nullable Handler handler) {
checkNotNull(packageName);
checkNotNull(callback);
@@ -129,6 +145,25 @@ public final class RuntimePermissionPresenter {
mRemoteService, packageName, permissionName));
}
+ /**
+ * Count how many apps have one of a set of permissions.
+ *
+ * @param permissionNames The permissions the app might have
+ * @param countOnlyGranted Count an app only if the permission is granted to the app
+ * @param countSystem Also count system apps
+ * @param callback Callback to receive the result
+ * @param handler Handler on which to invoke the callback
+ */
+ public void countPermissionApps(@NonNull List<String> permissionNames,
+ boolean countOnlyGranted, boolean countSystem,
+ @NonNull OnCountPermissionAppsResultCallback callback, @Nullable Handler handler) {
+ checkCollectionElementsNotNull(permissionNames, "permissionNames");
+ checkNotNull(callback);
+
+ mRemoteService.processMessage(obtainMessage(RemoteService::countPermissionApps,
+ mRemoteService, permissionNames, countOnlyGranted, countSystem, callback, handler));
+ }
+
private static final class RemoteService
extends Handler implements ServiceConnection {
private static final long UNBIND_TIMEOUT_MILLIS = 10000;
@@ -184,7 +219,7 @@ public final class RuntimePermissionPresenter {
}
private void getAppPermissions(@NonNull String packageName,
- @NonNull OnResultCallback callback, @Nullable Handler handler) {
+ @NonNull OnGetAppPermissionResultCallback callback, @Nullable Handler handler) {
final IRuntimePermissionPresenter remoteInstance;
synchronized (mLock) {
remoteInstance = mRemoteInstance;
@@ -241,6 +276,45 @@ public final class RuntimePermissionPresenter {
}
}
+ private void countPermissionApps(@NonNull List<String> permissionNames,
+ boolean countOnlyGranted, boolean countSystem,
+ @NonNull OnCountPermissionAppsResultCallback callback, @Nullable Handler handler) {
+ final IRuntimePermissionPresenter remoteInstance;
+
+ synchronized (mLock) {
+ remoteInstance = mRemoteInstance;
+ }
+ if (remoteInstance == null) {
+ return;
+ }
+
+ try {
+ remoteInstance.countPermissionApps(permissionNames, countOnlyGranted, countSystem,
+ new RemoteCallback(result -> {
+ final int numApps;
+ if (result != null) {
+ numApps = result.getInt(KEY_RESULT);
+ } else {
+ numApps = 0;
+ }
+
+ if (handler != null) {
+ handler.post(() -> callback.onCountPermissionApps(numApps));
+ } else {
+ callback.onCountPermissionApps(numApps);
+ }
+ }, this));
+ } catch (RemoteException re) {
+ Log.e(TAG, "Error counting permission apps", re);
+ }
+
+ scheduleUnbind();
+
+ synchronized (mLock) {
+ scheduleNextMessageIfNeededLocked();
+ }
+ }
+
private void unbind() {
synchronized (mLock) {
if (mBound) {
diff --git a/core/java/android/permission/RuntimePermissionPresenterService.java b/core/java/android/permission/RuntimePermissionPresenterService.java
index e50fc5ab5b2a..81ec7bed19af 100644
--- a/core/java/android/permission/RuntimePermissionPresenterService.java
+++ b/core/java/android/permission/RuntimePermissionPresenterService.java
@@ -16,6 +16,7 @@
package android.permission;
+import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull;
import static com.android.internal.util.Preconditions.checkNotNull;
import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage;
@@ -81,6 +82,18 @@ public abstract class RuntimePermissionPresenterService extends Service {
public abstract void onRevokeRuntimePermission(@NonNull String packageName,
@NonNull String permissionName);
+ /**
+ * Count how many apps have one of a set of permissions.
+ *
+ * @param permissionNames The permissions the app might have
+ * @param countOnlyGranted Count an app only if the permission is granted to the app
+ * @param countSystem Also count system apps
+ *
+ * @return the number of apps that have one of the permissions
+ */
+ public abstract int onCountPermissionApps(@NonNull List<String> permissionNames,
+ boolean countOnlyGranted, boolean countSystem);
+
@Override
public final IBinder onBind(Intent intent) {
return new IRuntimePermissionPresenter.Stub() {
@@ -106,6 +119,19 @@ public abstract class RuntimePermissionPresenterService extends Service {
RuntimePermissionPresenterService.this, packageName,
permissionName));
}
+
+ @Override
+ public void countPermissionApps(List<String> permissionNames, boolean countOnlyGranted,
+ boolean countSystem, RemoteCallback callback) {
+ checkCollectionElementsNotNull(permissionNames, "permissionNames");
+ checkNotNull(callback, "callback");
+
+ mHandler.sendMessage(
+ obtainMessage(
+ RuntimePermissionPresenterService::countPermissionApps,
+ RuntimePermissionPresenterService.this, permissionNames,
+ countOnlyGranted, countSystem, callback));
+ }
};
}
@@ -119,4 +145,13 @@ public abstract class RuntimePermissionPresenterService extends Service {
callback.sendResult(null);
}
}
+
+ private void countPermissionApps(@NonNull List<String> permissionNames,
+ boolean countOnlyGranted, boolean countSystem, @NonNull RemoteCallback callback) {
+ int numApps = onCountPermissionApps(permissionNames, countOnlyGranted, countSystem);
+
+ Bundle result = new Bundle();
+ result.putInt(RuntimePermissionPresenter.KEY_RESULT, numApps);
+ callback.sendResult(result);
+ }
}