Loading api/system-current.txt +8 −0 Original line number Original line Diff line number Diff line Loading @@ -4860,6 +4860,14 @@ package android.permission { field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR; field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR; } } public final class RuntimePermissionUsageInfo implements android.os.Parcelable { ctor public RuntimePermissionUsageInfo(java.lang.CharSequence, int); method public int describeContents(); method public java.lang.CharSequence getName(); method public int getAppAccessCount(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionUsageInfo> CREATOR; } } } package android.permissionpresenterservice { package android.permissionpresenterservice { Loading core/java/android/permission/IPermissionController.aidl +1 −0 Original line number Original line Diff line number Diff line Loading @@ -31,4 +31,5 @@ oneway interface IPermissionController { void revokeRuntimePermission(String packageName, String permissionName); void revokeRuntimePermission(String packageName, String permissionName); void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted, void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted, boolean countSystem, in RemoteCallback callback); boolean countSystem, in RemoteCallback callback); void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); } } core/java/android/permission/PermissionControllerManager.java +94 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.permission; import static android.permission.PermissionControllerService.SERVICE_INTERFACE; import static android.permission.PermissionControllerService.SERVICE_INTERFACE; import static com.android.internal.util.Preconditions.checkArgumentNonnegative; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkNotNull; Loading Loading @@ -146,6 +147,20 @@ public final class PermissionControllerManager { void onCountPermissionApps(int numApps); void onCountPermissionApps(int numApps); } } /** * Callback for delivering the result of {@link #getPermissionUsages}. * * @hide */ public interface OnPermissionUsageResultCallback { /** * The result for {@link #getPermissionUsages}. * * @param users The users list. */ void onPermissionUsageResult(@NonNull List<RuntimePermissionUsageInfo> users); } private final @NonNull Context mContext; private final @NonNull Context mContext; /** /** Loading Loading @@ -263,6 +278,28 @@ public final class PermissionControllerManager { handler == null ? sRemoteService.getHandler() : handler)); handler == null ? sRemoteService.getHandler() : handler)); } } /** * Count how many apps have used permissions. * * @param countSystem Also count system apps * @param numMillis The number of milliseconds in the past to check for uses * @param executor Executor on which to invoke the callback * @param callback Callback to receive the result * * @hide */ @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getPermissionUsages(boolean countSystem, long numMillis, @NonNull @CallbackExecutor Executor executor, @NonNull OnPermissionUsageResultCallback callback) { checkArgumentNonnegative(numMillis); checkNotNull(executor); checkNotNull(callback); sRemoteService.scheduleRequest(new PendingGetPermissionUsagesRequest(sRemoteService, countSystem, numMillis, executor, callback)); } /** /** * A connection to the remote service * A connection to the remote service */ */ Loading Loading @@ -521,4 +558,61 @@ public final class PermissionControllerManager { } } } } } } /** * Request for {@link #getPermissionUsages} */ private static final class PendingGetPermissionUsagesRequest extends AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { private final @NonNull OnPermissionUsageResultCallback mCallback; private final boolean mCountSystem; private final long mNumMillis; private final @NonNull RemoteCallback mRemoteCallback; private PendingGetPermissionUsagesRequest(@NonNull RemoteService service, boolean countSystem, long numMillis, @NonNull @CallbackExecutor Executor executor, @NonNull OnPermissionUsageResultCallback callback) { super(service); mCountSystem = countSystem; mNumMillis = numMillis; mCallback = callback; mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { long token = Binder.clearCallingIdentity(); try { final List<RuntimePermissionUsageInfo> reportedUsers; List<RuntimePermissionUsageInfo> users = null; if (result != null) { users = result.getParcelableArrayList(KEY_RESULT); } else { users = Collections.emptyList(); } reportedUsers = users; callback.onPermissionUsageResult(reportedUsers); } finally { Binder.restoreCallingIdentity(token); finish(); } }), null); } @Override protected void onTimeout(RemoteService remoteService) { mCallback.onPermissionUsageResult(Collections.emptyList()); } @Override public void run() { try { getService().getServiceInterface().getPermissionUsages(mCountSystem, mNumMillis, mRemoteCallback); } catch (RemoteException e) { Log.e(TAG, "Error counting permission users", e); } } } } } core/java/android/permission/PermissionControllerService.java +39 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.permission; package android.permission; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkArgumentNonnegative; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; Loading Loading @@ -112,6 +113,17 @@ public abstract class PermissionControllerService extends Service { public abstract int onCountPermissionApps(@NonNull List<String> permissionNames, public abstract int onCountPermissionApps(@NonNull List<String> permissionNames, boolean countOnlyGranted, boolean countSystem); boolean countOnlyGranted, boolean countSystem); /** * Count how many apps have used permissions. * * @param countSystem Also count system apps * @param numMillis The number of milliseconds in the past to check for uses * * @return descriptions of the users of permissions */ public abstract @NonNull List<RuntimePermissionUsageInfo> onPermissionUsageResult(boolean countSystem, long numMillis); @Override @Override public final IBinder onBind(Intent intent) { public final IBinder onBind(Intent intent) { return new IPermissionController.Stub() { return new IPermissionController.Stub() { Loading Loading @@ -187,6 +199,20 @@ public abstract class PermissionControllerService extends Service { PermissionControllerService.this, permissionNames, countOnlyGranted, PermissionControllerService.this, permissionNames, countOnlyGranted, countSystem, callback)); countSystem, callback)); } } @Override public void getPermissionUsages(boolean countSystem, long numMillis, RemoteCallback callback) { checkArgumentNonnegative(numMillis); checkNotNull(callback, "callback"); enforceCallingPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS, null); mHandler.sendMessage( obtainMessage(PermissionControllerService::getPermissionUsages, PermissionControllerService.this, countSystem, numMillis, callback)); } }; }; } } Loading Loading @@ -230,4 +256,17 @@ public abstract class PermissionControllerService extends Service { result.putInt(PermissionControllerManager.KEY_RESULT, numApps); result.putInt(PermissionControllerManager.KEY_RESULT, numApps); callback.sendResult(result); callback.sendResult(result); } } private void getPermissionUsages(boolean countSystem, long numMillis, @NonNull RemoteCallback callback) { List<RuntimePermissionUsageInfo> users = onPermissionUsageResult(countSystem, numMillis); if (users != null && !users.isEmpty()) { Bundle result = new Bundle(); result.putParcelableList(PermissionControllerManager.KEY_RESULT, users); callback.sendResult(result); } else { callback.sendResult(null); } } } } core/java/android/permission/RuntimePermissionUsageInfo.aidl 0 → 100644 +19 −0 Original line number Original line Diff line number Diff line /** * Copyright (c) 2019, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.permission; parcelable RuntimePermissionUsageInfo; No newline at end of file Loading
api/system-current.txt +8 −0 Original line number Original line Diff line number Diff line Loading @@ -4860,6 +4860,14 @@ package android.permission { field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR; field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionPresentationInfo> CREATOR; } } public final class RuntimePermissionUsageInfo implements android.os.Parcelable { ctor public RuntimePermissionUsageInfo(java.lang.CharSequence, int); method public int describeContents(); method public java.lang.CharSequence getName(); method public int getAppAccessCount(); method public void writeToParcel(android.os.Parcel, int); field public static final android.os.Parcelable.Creator<android.permission.RuntimePermissionUsageInfo> CREATOR; } } } package android.permissionpresenterservice { package android.permissionpresenterservice { Loading
core/java/android/permission/IPermissionController.aidl +1 −0 Original line number Original line Diff line number Diff line Loading @@ -31,4 +31,5 @@ oneway interface IPermissionController { void revokeRuntimePermission(String packageName, String permissionName); void revokeRuntimePermission(String packageName, String permissionName); void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted, void countPermissionApps(in List<String> permissionNames, boolean countOnlyGranted, boolean countSystem, in RemoteCallback callback); boolean countSystem, in RemoteCallback callback); void getPermissionUsages(boolean countSystem, long numMillis, in RemoteCallback callback); } }
core/java/android/permission/PermissionControllerManager.java +94 −0 Original line number Original line Diff line number Diff line Loading @@ -18,6 +18,7 @@ package android.permission; import static android.permission.PermissionControllerService.SERVICE_INTERFACE; import static android.permission.PermissionControllerService.SERVICE_INTERFACE; import static com.android.internal.util.Preconditions.checkArgumentNonnegative; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkNotNull; Loading Loading @@ -146,6 +147,20 @@ public final class PermissionControllerManager { void onCountPermissionApps(int numApps); void onCountPermissionApps(int numApps); } } /** * Callback for delivering the result of {@link #getPermissionUsages}. * * @hide */ public interface OnPermissionUsageResultCallback { /** * The result for {@link #getPermissionUsages}. * * @param users The users list. */ void onPermissionUsageResult(@NonNull List<RuntimePermissionUsageInfo> users); } private final @NonNull Context mContext; private final @NonNull Context mContext; /** /** Loading Loading @@ -263,6 +278,28 @@ public final class PermissionControllerManager { handler == null ? sRemoteService.getHandler() : handler)); handler == null ? sRemoteService.getHandler() : handler)); } } /** * Count how many apps have used permissions. * * @param countSystem Also count system apps * @param numMillis The number of milliseconds in the past to check for uses * @param executor Executor on which to invoke the callback * @param callback Callback to receive the result * * @hide */ @RequiresPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS) public void getPermissionUsages(boolean countSystem, long numMillis, @NonNull @CallbackExecutor Executor executor, @NonNull OnPermissionUsageResultCallback callback) { checkArgumentNonnegative(numMillis); checkNotNull(executor); checkNotNull(callback); sRemoteService.scheduleRequest(new PendingGetPermissionUsagesRequest(sRemoteService, countSystem, numMillis, executor, callback)); } /** /** * A connection to the remote service * A connection to the remote service */ */ Loading Loading @@ -521,4 +558,61 @@ public final class PermissionControllerManager { } } } } } } /** * Request for {@link #getPermissionUsages} */ private static final class PendingGetPermissionUsagesRequest extends AbstractRemoteService.PendingRequest<RemoteService, IPermissionController> { private final @NonNull OnPermissionUsageResultCallback mCallback; private final boolean mCountSystem; private final long mNumMillis; private final @NonNull RemoteCallback mRemoteCallback; private PendingGetPermissionUsagesRequest(@NonNull RemoteService service, boolean countSystem, long numMillis, @NonNull @CallbackExecutor Executor executor, @NonNull OnPermissionUsageResultCallback callback) { super(service); mCountSystem = countSystem; mNumMillis = numMillis; mCallback = callback; mRemoteCallback = new RemoteCallback(result -> executor.execute(() -> { long token = Binder.clearCallingIdentity(); try { final List<RuntimePermissionUsageInfo> reportedUsers; List<RuntimePermissionUsageInfo> users = null; if (result != null) { users = result.getParcelableArrayList(KEY_RESULT); } else { users = Collections.emptyList(); } reportedUsers = users; callback.onPermissionUsageResult(reportedUsers); } finally { Binder.restoreCallingIdentity(token); finish(); } }), null); } @Override protected void onTimeout(RemoteService remoteService) { mCallback.onPermissionUsageResult(Collections.emptyList()); } @Override public void run() { try { getService().getServiceInterface().getPermissionUsages(mCountSystem, mNumMillis, mRemoteCallback); } catch (RemoteException e) { Log.e(TAG, "Error counting permission users", e); } } } } }
core/java/android/permission/PermissionControllerService.java +39 −0 Original line number Original line Diff line number Diff line Loading @@ -17,6 +17,7 @@ package android.permission; package android.permission; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkArgument; import static com.android.internal.util.Preconditions.checkArgumentNonnegative; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkCollectionElementsNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.Preconditions.checkNotNull; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; import static com.android.internal.util.function.pooled.PooledLambda.obtainMessage; Loading Loading @@ -112,6 +113,17 @@ public abstract class PermissionControllerService extends Service { public abstract int onCountPermissionApps(@NonNull List<String> permissionNames, public abstract int onCountPermissionApps(@NonNull List<String> permissionNames, boolean countOnlyGranted, boolean countSystem); boolean countOnlyGranted, boolean countSystem); /** * Count how many apps have used permissions. * * @param countSystem Also count system apps * @param numMillis The number of milliseconds in the past to check for uses * * @return descriptions of the users of permissions */ public abstract @NonNull List<RuntimePermissionUsageInfo> onPermissionUsageResult(boolean countSystem, long numMillis); @Override @Override public final IBinder onBind(Intent intent) { public final IBinder onBind(Intent intent) { return new IPermissionController.Stub() { return new IPermissionController.Stub() { Loading Loading @@ -187,6 +199,20 @@ public abstract class PermissionControllerService extends Service { PermissionControllerService.this, permissionNames, countOnlyGranted, PermissionControllerService.this, permissionNames, countOnlyGranted, countSystem, callback)); countSystem, callback)); } } @Override public void getPermissionUsages(boolean countSystem, long numMillis, RemoteCallback callback) { checkArgumentNonnegative(numMillis); checkNotNull(callback, "callback"); enforceCallingPermission(Manifest.permission.GET_RUNTIME_PERMISSIONS, null); mHandler.sendMessage( obtainMessage(PermissionControllerService::getPermissionUsages, PermissionControllerService.this, countSystem, numMillis, callback)); } }; }; } } Loading Loading @@ -230,4 +256,17 @@ public abstract class PermissionControllerService extends Service { result.putInt(PermissionControllerManager.KEY_RESULT, numApps); result.putInt(PermissionControllerManager.KEY_RESULT, numApps); callback.sendResult(result); callback.sendResult(result); } } private void getPermissionUsages(boolean countSystem, long numMillis, @NonNull RemoteCallback callback) { List<RuntimePermissionUsageInfo> users = onPermissionUsageResult(countSystem, numMillis); if (users != null && !users.isEmpty()) { Bundle result = new Bundle(); result.putParcelableList(PermissionControllerManager.KEY_RESULT, users); callback.sendResult(result); } else { callback.sendResult(null); } } } }
core/java/android/permission/RuntimePermissionUsageInfo.aidl 0 → 100644 +19 −0 Original line number Original line Diff line number Diff line /** * Copyright (c) 2019, The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.permission; parcelable RuntimePermissionUsageInfo; No newline at end of file