Loading api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -4396,6 +4396,7 @@ package android.permission { ctor public RuntimePermissionPresenterService(); method public final void attachBaseContext(android.content.Context); method public final android.os.IBinder onBind(android.content.Intent); method public abstract int onCountPermissionApps(java.util.List<java.lang.String>, boolean, boolean); method public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(java.lang.String); method public abstract void onRevokeRuntimePermission(java.lang.String, java.lang.String); field public static final java.lang.String SERVICE_INTERFACE = "android.permission.RuntimePermissionPresenterService"; Loading core/java/android/permission/IRuntimePermissionPresenter.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -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); } core/java/android/permission/RuntimePermissionPresenter.java +79 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") Loading Loading @@ -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); Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading core/java/android/permission/RuntimePermissionPresenterService.java +35 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading @@ -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)); } }; } Loading @@ -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); } } packages/SettingsLib/src/com/android/settingslib/applications/PermissionsSummaryHelper.java +21 −26 Original line number Diff line number Diff line Loading @@ -15,7 +15,6 @@ */ package com.android.settingslib.applications; import android.annotation.NonNull; import android.content.Context; import android.permission.RuntimePermissionPresentationInfo; import android.permission.RuntimePermissionPresenter; Loading @@ -31,10 +30,7 @@ public class PermissionsSummaryHelper { final PermissionsResultCallback callback) { final RuntimePermissionPresenter presenter = RuntimePermissionPresenter.getInstance(context); presenter.getAppPermissions(pkg, new RuntimePermissionPresenter.OnResultCallback() { @Override public void onGetAppPermissions( @NonNull List<RuntimePermissionPresentationInfo> permissions) { presenter.getAppPermissions(pkg, permissions -> { final int permissionCount = permissions.size(); int grantedStandardCount = 0; Loading @@ -61,7 +57,6 @@ public class PermissionsSummaryHelper { callback.onPermissionSummaryResult(grantedStandardCount, requestedCount, grantedAdditionalCount, grantedStandardLabels); } }, null); } Loading Loading
api/system-current.txt +1 −0 Original line number Diff line number Diff line Loading @@ -4396,6 +4396,7 @@ package android.permission { ctor public RuntimePermissionPresenterService(); method public final void attachBaseContext(android.content.Context); method public final android.os.IBinder onBind(android.content.Intent); method public abstract int onCountPermissionApps(java.util.List<java.lang.String>, boolean, boolean); method public abstract java.util.List<android.permission.RuntimePermissionPresentationInfo> onGetAppPermissions(java.lang.String); method public abstract void onRevokeRuntimePermission(java.lang.String, java.lang.String); field public static final java.lang.String SERVICE_INTERFACE = "android.permission.RuntimePermissionPresenterService"; Loading
core/java/android/permission/IRuntimePermissionPresenter.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -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); }
core/java/android/permission/RuntimePermissionPresenter.java +79 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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") Loading Loading @@ -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); Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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) { Loading
core/java/android/permission/RuntimePermissionPresenterService.java +35 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading @@ -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)); } }; } Loading @@ -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); } }
packages/SettingsLib/src/com/android/settingslib/applications/PermissionsSummaryHelper.java +21 −26 Original line number Diff line number Diff line Loading @@ -15,7 +15,6 @@ */ package com.android.settingslib.applications; import android.annotation.NonNull; import android.content.Context; import android.permission.RuntimePermissionPresentationInfo; import android.permission.RuntimePermissionPresenter; Loading @@ -31,10 +30,7 @@ public class PermissionsSummaryHelper { final PermissionsResultCallback callback) { final RuntimePermissionPresenter presenter = RuntimePermissionPresenter.getInstance(context); presenter.getAppPermissions(pkg, new RuntimePermissionPresenter.OnResultCallback() { @Override public void onGetAppPermissions( @NonNull List<RuntimePermissionPresentationInfo> permissions) { presenter.getAppPermissions(pkg, permissions -> { final int permissionCount = permissions.size(); int grantedStandardCount = 0; Loading @@ -61,7 +57,6 @@ public class PermissionsSummaryHelper { callback.onPermissionSummaryResult(grantedStandardCount, requestedCount, grantedAdditionalCount, grantedStandardLabels); } }, null); } Loading