diff --git a/api/system-current.txt b/api/system-current.txt index 6186a5571badb..a559b7a27f592 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -1027,7 +1027,6 @@ package android.content.pm { method public abstract java.util.List getIntentFilterVerifications(java.lang.String); method public abstract int getIntentVerificationStatusAsUser(java.lang.String, int); method public abstract int getPermissionFlags(java.lang.String, java.lang.String, android.os.UserHandle); - method public android.os.PersistableBundle getSuspendedPackageAppExtras(java.lang.String); method public abstract void grantRuntimePermission(java.lang.String, java.lang.String, android.os.UserHandle); method public abstract int installExistingPackage(java.lang.String) throws android.content.pm.PackageManager.NameNotFoundException; method public abstract int installExistingPackage(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException; @@ -1039,7 +1038,6 @@ package android.content.pm { method public abstract boolean setDefaultBrowserPackageNameAsUser(java.lang.String, int); method public void setHarmfulAppWarning(java.lang.String, java.lang.CharSequence); method public java.lang.String[] setPackagesSuspended(java.lang.String[], boolean, android.os.PersistableBundle, android.os.PersistableBundle, java.lang.String); - method public void setSuspendedPackageAppExtras(java.lang.String, android.os.PersistableBundle); method public abstract void setUpdateAvailable(java.lang.String, boolean); method public abstract boolean updateIntentVerificationStatusAsUser(java.lang.String, int, int); method public abstract void updatePermissionFlags(java.lang.String, java.lang.String, int, int, android.os.UserHandle); diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 27bbc4bca2686..2e93d88e03885 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2165,29 +2165,17 @@ public class ApplicationPackageManager extends PackageManager { } @Override - public PersistableBundle getSuspendedPackageAppExtras(String packageName) { + public Bundle getSuspendedPackageAppExtras() { + final PersistableBundle extras; try { - return mPM.getSuspendedPackageAppExtras(packageName, mContext.getUserId()); + extras = mPM.getSuspendedPackageAppExtras(mContext.getOpPackageName(), + mContext.getUserId()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } - } - - @Override - public Bundle getSuspendedPackageAppExtras() { - final PersistableBundle extras = getSuspendedPackageAppExtras(mContext.getOpPackageName()); return extras != null ? new Bundle(extras.deepCopy()) : null; } - @Override - public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras) { - try { - mPM.setSuspendedPackageAppExtras(packageName, appExtras, mContext.getUserId()); - } catch (RemoteException e) { - e.rethrowFromSystemServer(); - } - } - @Override public boolean isPackageSuspendedForUser(String packageName, int userId) { try { diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 02ce47b85a083..2be33e94dc251 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -280,9 +280,6 @@ interface IPackageManager { PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId); - void setSuspendedPackageAppExtras(String packageName, in PersistableBundle appExtras, - int userId); - /** * Backup/restore support - only the system uid may use these. */ diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 34e3d8b5c2c80..90fc8f8bd652d 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -5615,46 +5615,6 @@ public abstract class PackageManager { throw new UnsupportedOperationException("isPackageSuspended not implemented"); } - /** - * Retrieve the {@link PersistableBundle} that was passed as {@code appExtras} when the given - * package was suspended. - * - *

The caller must hold permission {@link Manifest.permission#SUSPEND_APPS} to use this - * api.

- * - * @param packageName The package to retrieve extras for. - * @return The {@code appExtras} for the suspended package. - * - * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String) - * @hide - */ - @SystemApi - @RequiresPermission(Manifest.permission.SUSPEND_APPS) - public @Nullable PersistableBundle getSuspendedPackageAppExtras(String packageName) { - throw new UnsupportedOperationException("getSuspendedPackageAppExtras not implemented"); - } - - /** - * Set the app extras for a suspended package. This method can be used to update the appExtras - * for a package that was earlier suspended using - * {@link #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, - * String)} - * Does nothing if the given package is not already in a suspended state. - * - * @param packageName The package for which the appExtras need to be updated - * @param appExtras The new appExtras for the given package - * - * @see #setPackagesSuspended(String[], boolean, PersistableBundle, PersistableBundle, String) - * - * @hide - */ - @SystemApi - @RequiresPermission(Manifest.permission.SUSPEND_APPS) - public void setSuspendedPackageAppExtras(String packageName, - @Nullable PersistableBundle appExtras) { - throw new UnsupportedOperationException("setSuspendedPackageAppExtras not implemented"); - } - /** * Returns any extra information supplied as {@code appExtras} to the system when the calling * app was suspended. diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 5b45cbe1f658f..2206f3973e470 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -14021,7 +14021,7 @@ public class PackageManagerService extends IPackageManager.Stub "setPackagesSuspended for user " + userId); if (callingUid != Process.ROOT_UID && !UserHandle.isSameApp(getPackageUid(callingPackage, 0, userId), callingUid)) { - throw new IllegalArgumentException("callingPackage " + callingPackage + " does not" + throw new IllegalArgumentException("CallingPackage " + callingPackage + " does not" + " belong to calling app id " + UserHandle.getAppId(callingUid)); } @@ -14045,20 +14045,18 @@ public class PackageManagerService extends IPackageManager.Stub final PackageSetting pkgSetting = mSettings.mPackages.get(packageName); if (pkgSetting == null || filterAppAccessLPr(pkgSetting, callingUid, userId)) { - Slog.w(TAG, "Could not find package setting for package \"" + packageName - + "\". Skipping suspending/un-suspending."); + Slog.w(TAG, "Could not find package setting for package: " + packageName + + ". Skipping suspending/un-suspending."); unactionedPackages.add(packageName); continue; } - if (pkgSetting.getSuspended(userId) != suspended) { - if (!canSuspendPackageForUserLocked(packageName, userId)) { - unactionedPackages.add(packageName); - continue; - } - pkgSetting.setSuspended(suspended, callingPackage, dialogMessage, appExtras, - launcherExtras, userId); - changedPackagesList.add(packageName); + if (!canSuspendPackageForUserLocked(packageName, userId)) { + unactionedPackages.add(packageName); + continue; } + pkgSetting.setSuspended(suspended, callingPackage, dialogMessage, appExtras, + launcherExtras, userId); + changedPackagesList.add(packageName); } } } finally { @@ -14073,7 +14071,6 @@ public class PackageManagerService extends IPackageManager.Stub scheduleWritePackageRestrictionsLocked(userId); } } - return unactionedPackages.toArray(new String[unactionedPackages.size()]); } @@ -14081,7 +14078,8 @@ public class PackageManagerService extends IPackageManager.Stub public PersistableBundle getSuspendedPackageAppExtras(String packageName, int userId) { final int callingUid = Binder.getCallingUid(); if (getPackageUid(packageName, 0, userId) != callingUid) { - mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null); + throw new SecurityException("Calling package " + packageName + + " does not belong to calling uid " + callingUid); } synchronized (mPackages) { final PackageSetting ps = mSettings.mPackages.get(packageName); @@ -14096,25 +14094,6 @@ public class PackageManagerService extends IPackageManager.Stub } } - @Override - public void setSuspendedPackageAppExtras(String packageName, PersistableBundle appExtras, - int userId) { - final int callingUid = Binder.getCallingUid(); - mContext.enforceCallingOrSelfPermission(Manifest.permission.SUSPEND_APPS, null); - synchronized (mPackages) { - final PackageSetting ps = mSettings.mPackages.get(packageName); - if (ps == null || filterAppAccessLPr(ps, callingUid, userId)) { - throw new IllegalArgumentException("Unknown target package: " + packageName); - } - final PackageUserState packageUserState = ps.readUserState(userId); - if (packageUserState.suspended) { - packageUserState.suspendedAppExtras = appExtras; - sendMyPackageSuspendedOrUnsuspended(new String[] {packageName}, true, appExtras, - userId); - } - } - } - private void sendMyPackageSuspendedOrUnsuspended(String[] affectedPackages, boolean suspended, PersistableBundle appExtras, int userId) { final String action; @@ -14169,18 +14148,26 @@ public class PackageManagerService extends IPackageManager.Stub } } - void onSuspendingPackageRemoved(String packageName, int userId) { - final int[] userIds = (userId == UserHandle.USER_ALL) ? sUserManager.getUserIds() - : new int[] {userId}; - synchronized (mPackages) { - for (PackageSetting ps : mSettings.mPackages.values()) { - for (int user : userIds) { - final PackageUserState pus = ps.readUserState(user); + void onSuspendingPackageRemoved(String packageName, int removedForUser) { + final int[] userIds = (removedForUser == UserHandle.USER_ALL) ? sUserManager.getUserIds() + : new int[] {removedForUser}; + for (int userId : userIds) { + List affectedPackages = new ArrayList<>(); + synchronized (mPackages) { + for (PackageSetting ps : mSettings.mPackages.values()) { + final PackageUserState pus = ps.readUserState(userId); if (pus.suspended && packageName.equals(pus.suspendingPackage)) { - ps.setSuspended(false, null, null, null, null, user); + ps.setSuspended(false, null, null, null, null, userId); + affectedPackages.add(ps.name); } } } + if (!affectedPackages.isEmpty()) { + final String[] packageArray = affectedPackages.toArray( + new String[affectedPackages.size()]); + sendMyPackageSuspendedOrUnsuspended(packageArray, false, null, userId); + sendPackagesSuspendedForUser(packageArray, userId, false, null); + } } } diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index fd4c5e901b7a0..138594ccb4d61 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -20,8 +20,6 @@ import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DISABLED; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_ENABLED; -import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; - import android.content.pm.ApplicationInfo; import android.content.pm.IntentFilterVerificationInfo; import android.content.pm.PackageManager; diff --git a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java index 36e475378e387..084f7e5318580 100644 --- a/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/SuspendPackagesTest.java @@ -297,7 +297,7 @@ public class SuspendPackagesTest { intentFromApp.getBundleExtra(SuspendTestReceiver.EXTRA_SUSPENDED_APP_EXTRAS)); final PersistableBundle extras2 = getExtras("testMyPackageSuspendedOnChangingExtras", 2, "2", 0.2); - mPackageManager.setSuspendedPackageAppExtras(TEST_APP_PACKAGE_NAME, extras2); + suspendTestPackage(extras2, null, null); intentFromApp = mAppCommsReceiver.receiveIntentFromApp(); assertEquals("MY_PACKAGE_SUSPENDED delivery not reported", ACTION_REPORT_MY_PACKAGE_SUSPENDED, intentFromApp.getAction());