diff --git a/core/api/test-current.txt b/core/api/test-current.txt index f213221952023..cb90f6c15b71e 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -36,6 +36,7 @@ package android { field public static final String RECORD_BACKGROUND_AUDIO = "android.permission.RECORD_BACKGROUND_AUDIO"; field public static final String REMOVE_TASKS = "android.permission.REMOVE_TASKS"; field public static final String RESET_APP_ERRORS = "android.permission.RESET_APP_ERRORS"; + field public static final String REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL = "android.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL"; field public static final String SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS = "android.permission.SET_AND_VERIFY_LOCKSCREEN_CREDENTIALS"; field public static final String START_TASKS_FROM_RECENTS = "android.permission.START_TASKS_FROM_RECENTS"; field public static final String SUSPEND_APPS = "android.permission.SUSPEND_APPS"; @@ -2045,6 +2046,7 @@ package android.permission { method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List getIndicatorAppOpUsageData(); method @NonNull @RequiresPermission(android.Manifest.permission.GET_APP_OPS_STATS) public java.util.List getIndicatorAppOpUsageData(boolean); method @NonNull public android.content.AttributionSource registerAttributionSource(@NonNull android.content.AttributionSource); + method public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String, int); } } diff --git a/core/java/android/permission/IPermissionManager.aidl b/core/java/android/permission/IPermissionManager.aidl index 4a94c32501a1b..90b5e518ef1bc 100644 --- a/core/java/android/permission/IPermissionManager.aidl +++ b/core/java/android/permission/IPermissionManager.aidl @@ -67,6 +67,8 @@ interface IPermissionManager { void revokeRuntimePermission(String packageName, String permissionName, int userId, String reason); + void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId); + boolean shouldShowRequestPermissionRationale(String packageName, String permissionName, int userId); diff --git a/core/java/android/permission/PermissionManager.java b/core/java/android/permission/PermissionManager.java index 3ea50e98879ba..4f2287606e05e 100644 --- a/core/java/android/permission/PermissionManager.java +++ b/core/java/android/permission/PermissionManager.java @@ -1362,6 +1362,26 @@ public final class PermissionManager { return false; } + /** + * Revoke the POST_NOTIFICATIONS permission, without killing the app. This method must ONLY BE + * USED in CTS or local tests. + * + * @param packageName The package to be revoked + * @param userId The user for which to revoke + * + * @hide + */ + @TestApi + public void revokePostNotificationPermissionWithoutKillForTest(@NonNull String packageName, + int userId) { + try { + mPermissionManager.revokePostNotificationPermissionWithoutKillForTest(packageName, + userId); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + } + /* @hide */ private static int checkPermissionUncached(@Nullable String permission, int pid, int uid) { final IActivityManager am = ActivityManager.getService(); diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index dfcfd5f295e20..f692e12782ed8 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -4438,6 +4438,12 @@ + + + + + + killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED)); @@ -1438,9 +1446,29 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt reason, mDefaultPermissionCallback); } + @Override + public void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId) { + final int callingUid = Binder.getCallingUid(); + final boolean overridePolicy = + checkUidPermission(callingUid, ADJUST_RUNTIME_PERMISSIONS_POLICY) + == PackageManager.PERMISSION_GRANTED; + mContext.enforceCallingPermission( + android.Manifest.permission.REVOKE_POST_NOTIFICATIONS_WITHOUT_KILL, ""); + revokeRuntimePermissionInternal(packageName, Manifest.permission.POST_NOTIFICATIONS, + overridePolicy, true, callingUid, userId, + SKIP_KILL_APP_REASON_NOTIFICATION_TEST, mDefaultPermissionCallback); + } + private void revokeRuntimePermissionInternal(String packageName, String permName, - boolean overridePolicy, int callingUid, final int userId, String reason, - PermissionCallback callback) { + boolean overridePolicy, int callingUid, final int userId, + String reason, PermissionCallback callback) { + revokeRuntimePermissionInternal(packageName, permName, overridePolicy, false, callingUid, + userId, reason, callback); + } + + private void revokeRuntimePermissionInternal(String packageName, String permName, + boolean overridePolicy, boolean overrideKill, int callingUid, final int userId, + String reason, PermissionCallback callback) { if (PermissionManager.DEBUG_TRACE_PERMISSION_UPDATES && PermissionManager.shouldTraceGrant(packageName, permName, userId)) { Log.i(TAG, "System is revoking " + packageName + " " @@ -1552,7 +1580,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt if (callback != null) { if (isRuntimePermission) { callback.onPermissionRevoked(UserHandle.getUid(userId, pkg.getUid()), userId, - reason); + reason, overrideKill); } else { mDefaultPermissionCallback.onInstallPermissionRevoked(); } @@ -5197,7 +5225,11 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt public void onPermissionChanged() {} public void onPermissionGranted(int uid, @UserIdInt int userId) {} public void onInstallPermissionGranted() {} - public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason) {} + public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason) { + onPermissionRevoked(uid, userId, reason, false); + } + public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason, + boolean overrideKill) {} public void onInstallPermissionRevoked() {} public void onPermissionUpdated(@UserIdInt int[] updatedUserIds, boolean sync) {} public void onPermissionUpdatedNotifyListener(@UserIdInt int[] updatedUserIds, boolean sync, diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java index d2018f26d04ad..3771f030aefaf 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceInterface.java @@ -317,6 +317,15 @@ public interface PermissionManagerServiceInterface extends PermissionManagerInte void revokeRuntimePermission(String packageName, String permName, int userId, String reason); + /** + * Revoke the POST_NOTIFICATIONS permission, without killing the app. This method must ONLY BE + * USED in CTS or local tests. + * + * @param packageName The package to be revoked + * @param userId The user for which to revoke + */ + void revokePostNotificationPermissionWithoutKillForTest(String packageName, int userId); + /** * Get whether you should show UI with rationale for requesting a permission. You should do this * only if you do not have the permission and the context in which the permission is requested