diff options
4 files changed, 37 insertions, 6 deletions
diff --git a/core/java/android/app/ActivityManagerInternal.java b/core/java/android/app/ActivityManagerInternal.java index 021f932c562c..32c40df32585 100644 --- a/core/java/android/app/ActivityManagerInternal.java +++ b/core/java/android/app/ActivityManagerInternal.java @@ -35,6 +35,7 @@ import android.content.ServiceConnection; import android.content.pm.ActivityInfo; import android.content.pm.ActivityPresentationInfo; import android.content.pm.ApplicationInfo; +import android.content.pm.IPackageDataObserver; import android.content.pm.UserInfo; import android.net.Uri; import android.os.Bundle; @@ -1224,4 +1225,13 @@ public abstract class ActivityManagerInternal { */ @NonNull public abstract StatsEvent getCachedAppsHighWatermarkStats(int atomTag, boolean resetAfterPull); + + /** + * Internal method for clearing app data, with the extra param that is used to indicate restore. + * Used by Backup service during restore operation. + * + * @hide + */ + public abstract boolean clearApplicationUserData(String packageName, boolean keepState, + boolean isRestore, IPackageDataObserver observer, int userId); } diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java index 307f30619be2..f3cd43bf3ed8 100644 --- a/core/java/android/content/Intent.java +++ b/core/java/android/content/Intent.java @@ -6685,6 +6685,15 @@ public class Intent implements Parcelable, Cloneable { public static final String EXTRA_VISIBILITY_ALLOW_LIST = "android.intent.extra.VISIBILITY_ALLOW_LIST"; + /** + * A boolean extra used with {@link #ACTION_PACKAGE_DATA_CLEARED} which indicates if the intent + * is broadcast as part of a restore operation. + * + * @hide + */ + public static final String EXTRA_IS_RESTORE = + "android.intent.extra.IS_RESTORE"; + // --------------------------------------------------------------------- // --------------------------------------------------------------------- // Intent flags (see mFlags variable). diff --git a/services/backup/java/com/android/server/backup/UserBackupManagerService.java b/services/backup/java/com/android/server/backup/UserBackupManagerService.java index 7261709d7b8d..400980948a62 100644 --- a/services/backup/java/com/android/server/backup/UserBackupManagerService.java +++ b/services/backup/java/com/android/server/backup/UserBackupManagerService.java @@ -1742,12 +1742,8 @@ public class UserBackupManagerService { synchronized (mClearDataLock) { mClearingData = true; - try { - mActivityManager.clearApplicationUserData(packageName, keepSystemState, observer, - mUserId); - } catch (RemoteException e) { - // can't happen because the activity manager is in this process - } + mActivityManagerInternal.clearApplicationUserData(packageName, keepSystemState, + /*isRestore=*/ true, observer, mUserId); // Only wait 30 seconds for the clear data to happen. long timeoutMark = System.currentTimeMillis() + CLEAR_DATA_TIMEOUT_INTERVAL; diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index df5b83a4c1b3..e83d4b954aa9 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -3449,6 +3449,12 @@ public class ActivityManagerService extends IActivityManager.Stub @Override public boolean clearApplicationUserData(final String packageName, boolean keepState, final IPackageDataObserver observer, int userId) { + return clearApplicationUserData(packageName, keepState, /*isRestore=*/ false, observer, + userId); + } + + private boolean clearApplicationUserData(final String packageName, boolean keepState, + boolean isRestore, final IPackageDataObserver observer, int userId) { enforceNotIsolatedCaller("clearApplicationUserData"); int uid = Binder.getCallingUid(); int pid = Binder.getCallingPid(); @@ -3543,6 +3549,9 @@ public class ActivityManagerService extends IActivityManager.Stub intent.putExtra(Intent.EXTRA_UID, (appInfo != null) ? appInfo.uid : INVALID_UID); intent.putExtra(Intent.EXTRA_USER_HANDLE, resolvedUserId); + if (isRestore) { + intent.putExtra(Intent.EXTRA_IS_RESTORE, true); + } if (isInstantApp) { intent.putExtra(Intent.EXTRA_PACKAGE_NAME, packageName); } @@ -18758,6 +18767,13 @@ public class ActivityManagerService extends IActivityManager.Stub return mAppProfiler.mCachedAppsWatermarkData.getCachedAppsHighWatermarkStats( atomTag, resetAfterPull); } + + @Override + public boolean clearApplicationUserData(final String packageName, boolean keepState, + boolean isRestore, final IPackageDataObserver observer, int userId) { + return ActivityManagerService.this.clearApplicationUserData(packageName, keepState, + isRestore, observer, userId); + } } long inputDispatchingTimedOut(int pid, final boolean aboveSystem, TimeoutRecord timeoutRecord) { |