summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Nate Myren <ntmyren@google.com> 2022-05-12 15:21:11 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2022-05-12 15:21:11 +0000
commitae05ae14791e8c968c106ed55df9e56ff3bb198e (patch)
tree8dfb8df289061665b5f22fd139dccd5b38dd6699
parentbd767e19e730bf969a0aa6f28d8fa2864936bc18 (diff)
parent7b2c863f6ae53bd4a663f968cdce90ccd3de79b3 (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.java51
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,