diff options
| author | 2022-05-12 15:21:11 +0000 | |
|---|---|---|
| committer | 2022-05-12 15:21:11 +0000 | |
| commit | ae05ae14791e8c968c106ed55df9e56ff3bb198e (patch) | |
| tree | 8dfb8df289061665b5f22fd139dccd5b38dd6699 | |
| parent | bd767e19e730bf969a0aa6f28d8fa2864936bc18 (diff) | |
| parent | 7b2c863f6ae53bd4a663f968cdce90ccd3de79b3 (diff) | |
Merge "Do not kill backup apps during restore for POST_NOTIFICATIONS" into tm-dev
| -rw-r--r-- | services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java | 51 |
1 files changed, 43 insertions, 8 deletions
diff --git a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java index 7be83b03243a..d34682df3413 100644 --- a/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java +++ b/services/core/java/com/android/server/pm/permission/PermissionManagerServiceImpl.java @@ -42,6 +42,7 @@ import static android.content.pm.PackageManager.FLAG_PERMISSION_WHITELIST_SYSTEM import static android.content.pm.PackageManager.FLAG_PERMISSION_WHITELIST_UPGRADE; import static android.content.pm.PackageManager.MASK_PERMISSION_FLAGS_ALL; import static android.content.pm.PackageManager.MATCH_DEBUG_TRIAGED_MISSING; +import static android.content.pm.PackageManager.PERMISSION_GRANTED; import static android.os.Process.INVALID_UID; import static android.os.Trace.TRACE_TAG_PACKAGE_MANAGER; import static android.permission.PermissionManager.KILL_APP_REASON_GIDS_CHANGED; @@ -97,6 +98,7 @@ import android.os.storage.StorageManager; import android.permission.IOnPermissionsChangeListener; import android.permission.PermissionControllerManager; import android.permission.PermissionManager; +import android.provider.Settings; import android.text.TextUtils; import android.util.ArrayMap; import android.util.ArraySet; @@ -333,7 +335,8 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt mPackageManagerInt.writeSettings(true); } @Override - public void onPermissionRevoked(int uid, int userId, String reason, boolean overrideKill) { + public void onPermissionRevoked(int uid, int userId, String reason, boolean overrideKill, + @Nullable String permissionName) { mOnPermissionChangeListeners.onPermissionsChanged(uid); // Critical; after this call the application should never have the permission @@ -342,13 +345,41 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt return; } - final int appId = UserHandle.getAppId(uid); - if (reason == null) { - mHandler.post(() -> killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED)); - } else { - mHandler.post(() -> killUid(appId, userId, reason)); + mHandler.post(() -> { + if (POST_NOTIFICATIONS.equals(permissionName) + && isAppBackupAndRestoreRunning(uid)) { + return; + } + + final int appId = UserHandle.getAppId(uid); + if (reason == null) { + killUid(appId, userId, KILL_APP_REASON_PERMISSIONS_REVOKED); + } else { + killUid(appId, userId, reason); + } + }); + } + + private boolean isAppBackupAndRestoreRunning(int uid) { + if (checkUidPermission(uid, Manifest.permission.BACKUP) != PERMISSION_GRANTED) { + return false; + } + + try { + int userId = UserHandle.getUserId(uid); + boolean isInSetup = Settings.Secure.getIntForUser(mContext.getContentResolver(), + Settings.Secure.USER_SETUP_COMPLETE, userId) == 0; + boolean isInDeferredSetup = Settings.Secure.getIntForUser( + mContext.getContentResolver(), + Settings.Secure.USER_SETUP_PERSONALIZATION_STATE, userId) + == Settings.Secure.USER_SETUP_PERSONALIZATION_STARTED; + return isInSetup || isInDeferredSetup; + } catch (Settings.SettingNotFoundException e) { + Slog.w(LOG_TAG, "Failed to check if the user is in restore: " + e); + return false; } } + @Override public void onInstallPermissionRevoked() { mPackageManagerInt.writeSettings(true); @@ -1600,7 +1631,7 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt if (callback != null) { if (isRuntimePermission) { callback.onPermissionRevoked(UserHandle.getUid(userId, pkg.getUid()), userId, - reason, overrideKill); + reason, overrideKill, permName); } else { mDefaultPermissionCallback.onInstallPermissionRevoked(); } @@ -5246,7 +5277,11 @@ public class PermissionManagerServiceImpl implements PermissionManagerServiceInt onPermissionRevoked(uid, userId, reason, false); } public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason, - boolean overrideKill) {} + boolean overrideKill) { + onPermissionRevoked(uid, userId, reason, false, null); + } + public void onPermissionRevoked(int uid, @UserIdInt int userId, String reason, + boolean overrideKill, @Nullable String permissionName) {} public void onInstallPermissionRevoked() {} public void onPermissionUpdated(@UserIdInt int[] updatedUserIds, boolean sync) {} public void onPermissionUpdatedNotifyListener(@UserIdInt int[] updatedUserIds, boolean sync, |