diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 87c86df6140d5dd77dfb624eaf0609256672da8b..287d2bd9e6a7353e5c77b0f0fe75d25173951f58 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -2909,7 +2909,7 @@ public class ApplicationPackageManager extends PackageManager { try { return mPM.setPackagesSuspendedAsUser(packageNames, suspended, appExtras, launcherExtras, dialogInfo, flags, mContext.getOpPackageName(), - getUserId()); + UserHandle.myUserId() /* suspendingUserId */, getUserId() /* targetUserId */); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 98623de810c48ef67f990c17f907e229779a4f6f..6dc8d4738c87720210284eb2ad11a863fd8c603e 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -300,7 +300,8 @@ interface IPackageManager { String[] setPackagesSuspendedAsUser(in String[] packageNames, boolean suspended, in PersistableBundle appExtras, in PersistableBundle launcherExtras, - in SuspendDialogInfo dialogInfo, int flags, String callingPackage, int userId); + in SuspendDialogInfo dialogInfo, int flags, String suspendingPackage, + int suspendingUserId, int targetUserId); String[] getUnsuspendablePackagesForUser(in String[] packageNames, int userId); diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 82a8c11f024f89072c43c06ea09fd210b5143cbc..a8638708824b62629191ce777a83f118503b7993 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -10000,6 +10000,9 @@ public abstract class PackageManager { * device administrators or apps holding {@link android.Manifest.permission#MANAGE_USERS} or * {@link android.Manifest.permission#SUSPEND_APPS}. * + * <p> + * <strong>Note:</strong>This API doesn't support cross user suspension and should only be used + * for testing. * @param suspendedPackage The package that has been suspended. * @return Name of the package that suspended the given package. Returns {@code null} if the * given package is not currently suspended and the platform package name - i.e. diff --git a/core/java/com/android/internal/app/SuspendedAppActivity.java b/core/java/com/android/internal/app/SuspendedAppActivity.java index efc1455ecd456f235acdfa536de37bc2899f4e5b..f1aa330f562c5de386f5649be3509df593d98da0 100644 --- a/core/java/com/android/internal/app/SuspendedAppActivity.java +++ b/core/java/com/android/internal/app/SuspendedAppActivity.java @@ -39,6 +39,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.SuspendDialogInfo; +import android.content.pm.UserPackage; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; @@ -308,7 +309,8 @@ public class SuspendedAppActivity extends AlertActivity try { final String[] errored = ipm.setPackagesSuspendedAsUser( new String[]{mSuspendedPackage}, false, null, null, null, 0, - mSuspendingPackage, mUserId); + mSuspendingPackage, mUserId /* suspendingUserId */, + mUserId /* targetUserId */); if (ArrayUtils.contains(errored, mSuspendedPackage)) { Slog.e(TAG, "Could not unsuspend " + mSuspendedPackage); break; @@ -350,17 +352,18 @@ public class SuspendedAppActivity extends AlertActivity } public static Intent createSuspendedAppInterceptIntent(String suspendedPackage, - String suspendingPackage, SuspendDialogInfo dialogInfo, Bundle options, + UserPackage suspendingPackage, SuspendDialogInfo dialogInfo, Bundle options, IntentSender onUnsuspend, int userId) { - return new Intent() + Intent intent = new Intent() .setClassName("android", SuspendedAppActivity.class.getName()) .putExtra(EXTRA_SUSPENDED_PACKAGE, suspendedPackage) .putExtra(EXTRA_DIALOG_INFO, dialogInfo) - .putExtra(EXTRA_SUSPENDING_PACKAGE, suspendingPackage) + .putExtra(EXTRA_SUSPENDING_PACKAGE, suspendingPackage.packageName) .putExtra(EXTRA_UNSUSPEND_INTENT, onUnsuspend) .putExtra(EXTRA_ACTIVITY_OPTIONS, options) .putExtra(Intent.EXTRA_USER_ID, userId) .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); + return intent; } } diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 77a5e3db2abad6d8b8e448ec3ba04b33fcd35215..a4b28967e3b271aa4a0fc1c9442e197baf42954e 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -72,6 +72,7 @@ import android.content.pm.ServiceInfo; import android.content.pm.ShortcutServiceInternal; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; +import android.content.pm.UserPackage; import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; @@ -559,10 +560,11 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku onClickIntent = UnlaunchableAppActivity.createInQuietModeDialogIntent(appUserId); } else if (provider.maskedBySuspendedPackage) { showBadge = mUserManager.hasBadge(appUserId); - final String suspendingPackage = mPackageManagerInternal.getSuspendingPackage( + final UserPackage suspendingPackage = mPackageManagerInternal.getSuspendingPackage( appInfo.packageName, appUserId); // TODO(b/281839596): don't rely on platform always meaning suspended by admin. - if (PLATFORM_PACKAGE_NAME.equals(suspendingPackage)) { + if (suspendingPackage != null + && PLATFORM_PACKAGE_NAME.equals(suspendingPackage.packageName)) { onClickIntent = mDevicePolicyManagerInternal.createShowAdminSupportIntent( appUserId, true); } else { diff --git a/services/core/java/android/content/pm/PackageManagerInternal.java b/services/core/java/android/content/pm/PackageManagerInternal.java index 136692eb90d5543402c068b0be9456243a45f029..cac2efba1c8935ebe861388c9fe37d21877ae897 100644 --- a/services/core/java/android/content/pm/PackageManagerInternal.java +++ b/services/core/java/android/content/pm/PackageManagerInternal.java @@ -289,11 +289,11 @@ public abstract class PackageManagerInternal { * * @param suspendedPackage The package that has been suspended. * @param userId The user for which to check. - * @return Name of the package that suspended the given package. Returns {@code null} if the - * given package is not currently suspended and the platform package name - i.e. - * {@code "android"} - if the package was suspended by a device admin. + * @return User id and package name of the package that suspended the given package. Returns + * {@code null} if the given package is not currently suspended and the platform package name + * - i.e. {@code "android"} - if the package was suspended by a device admin. */ - public abstract String getSuspendingPackage(String suspendedPackage, int userId); + public abstract UserPackage getSuspendingPackage(String suspendedPackage, int userId); /** * Suspend or unsuspend packages upon admin request. @@ -312,13 +312,13 @@ public abstract class PackageManagerInternal { * suspended application. * * @param suspendedPackage The package that has been suspended. - * @param suspendingPackage + * @param suspendingPackage The package responsible for suspension. * @param userId The user for which to check. * @return A {@link SuspendDialogInfo} object describing the dialog to be shown. */ @Nullable public abstract SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, - String suspendingPackage, int userId); + UserPackage suspendingPackage, int userId); /** * Gets any distraction flags set via @@ -1168,14 +1168,14 @@ public abstract class PackageManagerInternal { public abstract void clearBlockUninstallForUser(@UserIdInt int userId); /** - * Unsuspends all packages suspended by the given package for the user. + * Unsuspends all packages suspended by an admin for the user. */ - public abstract void unsuspendForSuspendingPackage(String suspendingPackage, int userId); + public abstract void unsuspendAdminSuspendedPackages(int userId); /** - * Returns {@code true} if the package is suspending any packages for the user. + * Returns {@code true} if an admin is suspending any packages for the user. */ - public abstract boolean isSuspendingAnyPackages(String suspendingPackage, int userId); + public abstract boolean isAdminSuspendingAnyPackages(int userId); /** * Register to listen for loading progress of an installed package. diff --git a/services/core/java/com/android/server/pm/Computer.java b/services/core/java/com/android/server/pm/Computer.java index 27f4e11c53adda611b4e80fe99950f7207d6ab1e..482807c397ea7e9a98ea9853eea879d81b3d2c9c 100644 --- a/services/core/java/com/android/server/pm/Computer.java +++ b/services/core/java/com/android/server/pm/Computer.java @@ -518,7 +518,9 @@ public interface Computer extends PackageDataSnapshot { boolean isPackageStoppedForUser(@NonNull String packageName, @UserIdInt int userId) throws PackageManager.NameNotFoundException; - boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, @UserIdInt int userId); + /** Check if the package is suspending any package. */ + boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, + @UserIdInt int suspendingUserId, int targetUserId); @NonNull ParceledListSlice<IntentFilter> getAllIntentFilters(@NonNull String packageName); diff --git a/services/core/java/com/android/server/pm/ComputerEngine.java b/services/core/java/com/android/server/pm/ComputerEngine.java index 744c946610673627688a386825c6b0cd0ed6b904..3cb2420cd22319ced20f9fca3e9a2779fba64275 100644 --- a/services/core/java/com/android/server/pm/ComputerEngine.java +++ b/services/core/java/com/android/server/pm/ComputerEngine.java @@ -96,6 +96,7 @@ import android.content.pm.Signature; import android.content.pm.SigningDetails; import android.content.pm.SigningInfo; import android.content.pm.UserInfo; +import android.content.pm.UserPackage; import android.content.pm.VersionedPackage; import android.os.Binder; import android.os.Build; @@ -5008,11 +5009,13 @@ public class ComputerEngine implements Computer { @Override public boolean isSuspendingAnyPackages(@NonNull String suspendingPackage, - @UserIdInt int userId) { + @UserIdInt int suspendingUserId, int targetUserId) { + final UserPackage suspender = UserPackage.of(suspendingUserId, suspendingPackage); for (final PackageStateInternal packageState : getPackageStates().values()) { - final PackageUserStateInternal state = packageState.getUserStateOrDefault(userId); + final PackageUserStateInternal state = + packageState.getUserStateOrDefault(targetUserId); if (state.getSuspendParams() != null - && state.getSuspendParams().containsKey(suspendingPackage)) { + && state.getSuspendParams().containsKey(suspender)) { return true; } } diff --git a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java index c737b45ae8857174477107f266de2dacca25df92..8da168375447fe49c40d0c9e283d0453701bcd77 100644 --- a/services/core/java/com/android/server/pm/PackageManagerInternalBase.java +++ b/services/core/java/com/android/server/pm/PackageManagerInternalBase.java @@ -19,6 +19,8 @@ package com.android.server.pm; import static android.content.pm.PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; import static android.content.pm.PackageManager.RESTRICTION_NONE; +import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -37,6 +39,7 @@ import android.content.pm.ProcessInfo; import android.content.pm.ProviderInfo; import android.content.pm.ResolveInfo; import android.content.pm.SuspendDialogInfo; +import android.content.pm.UserPackage; import android.os.Binder; import android.os.Build; import android.os.Bundle; @@ -250,7 +253,7 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { getSuspendPackageHelper().removeSuspensionsBySuspendingPackage(snapshot(), new String[]{packageName}, (suspendingPackage) -> !PackageManagerService.PLATFORM_PACKAGE_NAME.equals( - suspendingPackage), + suspendingPackage.packageName), userId); } @@ -269,7 +272,7 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { @Override @Deprecated - public final String getSuspendingPackage(String suspendedPackage, int userId) { + public final UserPackage getSuspendingPackage(String suspendedPackage, int userId) { return getSuspendPackageHelper().getSuspendingPackage(snapshot(), suspendedPackage, userId, Binder.getCallingUid()); } @@ -277,7 +280,7 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { @Override @Deprecated public final SuspendDialogInfo getSuspendedDialogInfo(String suspendedPackage, - String suspendingPackage, int userId) { + UserPackage suspendingPackage, int userId) { return getSuspendPackageHelper().getSuspendedDialogInfo(snapshot(), suspendedPackage, suspendingPackage, userId, Binder.getCallingUid()); } @@ -683,14 +686,16 @@ abstract class PackageManagerInternalBase extends PackageManagerInternal { @Override @Deprecated - public final void unsuspendForSuspendingPackage(final String packageName, int affectedUser) { - mService.unsuspendForSuspendingPackage(snapshot(), packageName, affectedUser); + public final void unsuspendAdminSuspendedPackages(int affectedUser) { + final int suspendingUserId = affectedUser; + mService.unsuspendForSuspendingPackage(snapshot(), PLATFORM_PACKAGE_NAME, suspendingUserId); } @Override @Deprecated - public final boolean isSuspendingAnyPackages(String suspendingPackage, int userId) { - return snapshot().isSuspendingAnyPackages(suspendingPackage, userId); + public final boolean isAdminSuspendingAnyPackages(int userId) { + final int suspendingUserId = userId; + return snapshot().isSuspendingAnyPackages(PLATFORM_PACKAGE_NAME, suspendingUserId, userId); } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 56365b676618ef3c715022795d7b8ff7e6241e05..bc441b84c58b461eca7e9c9258dcf6d14fba2ec2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -292,6 +292,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Consumer; +import java.util.function.Predicate; /** * Keep track of all those APKs everywhere. @@ -3137,7 +3138,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService } private void enforceCanSetPackagesSuspendedAsUser(@NonNull Computer snapshot, - boolean quarantined, String callingPackage, int callingUid, int userId, + boolean quarantined, UserPackage suspender, int callingUid, int targetUserId, String callingMethod) { if (callingUid == Process.ROOT_UID // Need to compare app-id to allow system dialogs access on secondary users @@ -3145,9 +3146,10 @@ public class PackageManagerService implements PackageSender, TestUtilityService return; } - final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId); + final String ownerPackage = + mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(targetUserId); if (ownerPackage != null) { - final int ownerUid = snapshot.getPackageUid(ownerPackage, 0, userId); + final int ownerUid = snapshot.getPackageUid(ownerPackage, 0, targetUserId); if (ownerUid == callingUid) { return; } @@ -3168,25 +3170,27 @@ public class PackageManagerService implements PackageSender, TestUtilityService callingMethod); } - final int packageUid = snapshot.getPackageUid(callingPackage, 0, userId); + final int packageUid = snapshot.getPackageUid(suspender.packageName, 0, targetUserId); final boolean allowedPackageUid = packageUid == callingUid; // TODO(b/139383163): remove special casing for shell and enforce INTERACT_ACROSS_USERS_FULL final boolean allowedShell = callingUid == SHELL_UID && UserHandle.isSameApp(packageUid, callingUid); if (!allowedShell && !allowedPackageUid) { - throw new SecurityException("Calling package " + callingPackage + " in user " - + userId + " does not belong to calling uid " + callingUid); + throw new SecurityException("Suspending package " + suspender.packageName + + " in user " + targetUserId + " does not belong to calling uid " + callingUid); } } void unsuspendForSuspendingPackage(@NonNull Computer computer, String suspendingPackage, - @UserIdInt int userId) { + @UserIdInt int suspendingUserId) { // TODO: This can be replaced by a special parameter to iterate all packages, rather than // this weird pre-collect of all packages. final String[] allPackages = computer.getPackageStates().keySet().toArray(new String[0]); + final Predicate<UserPackage> suspenderPredicate = + UserPackage.of(suspendingUserId, suspendingPackage)::equals; mSuspendPackageHelper.removeSuspensionsBySuspendingPackage(computer, - allPackages, suspendingPackage::equals, userId); + allPackages, suspenderPredicate, suspendingUserId); } void removeAllDistractingPackageRestrictions(@NonNull Computer snapshot, int userId) { @@ -5259,8 +5263,9 @@ public class PackageManagerService implements PackageSender, TestUtilityService if (!snapshot.isPackageSuspendedForUser(packageName, userId)) { return null; } - return mSuspendPackageHelper.getSuspendingPackage(snapshot, packageName, userId, - callingUid); + final UserPackage suspender = mSuspendPackageHelper.getSuspendingPackage( + snapshot, packageName, userId, callingUid); + return suspender != null ? suspender.packageName : null; } catch (PackageManager.NameNotFoundException e) { return null; } @@ -6198,7 +6203,8 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public String[] setPackagesSuspendedAsUser(String[] packageNames, boolean suspended, PersistableBundle appExtras, PersistableBundle launcherExtras, - SuspendDialogInfo dialogInfo, int flags, String callingPackage, int userId) { + SuspendDialogInfo dialogInfo, int flags, String suspendingPackage, + int suspendingUserId, int targetUserId) { final int callingUid = Binder.getCallingUid(); boolean quarantined = false; if (Flags.quarantinedEnabled()) { @@ -6207,14 +6213,15 @@ public class PackageManagerService implements PackageSender, TestUtilityService } else if (FeatureFlagUtils.isEnabled(mContext, SETTINGS_TREAT_PAUSE_AS_QUARANTINE)) { final String wellbeingPkg = mContext.getString(R.string.config_systemWellbeing); - quarantined = callingPackage.equals(wellbeingPkg); + quarantined = suspendingPackage.equals(wellbeingPkg); } } final Computer snapshot = snapshotComputer(); - enforceCanSetPackagesSuspendedAsUser(snapshot, quarantined, callingPackage, callingUid, - userId, "setPackagesSuspendedAsUser"); + final UserPackage suspender = UserPackage.of(targetUserId, suspendingPackage); + enforceCanSetPackagesSuspendedAsUser(snapshot, quarantined, suspender, callingUid, + targetUserId, "setPackagesSuspendedAsUser"); return mSuspendPackageHelper.setPackagesSuspended(snapshot, packageNames, suspended, - appExtras, launcherExtras, dialogInfo, callingPackage, userId, callingUid, + appExtras, launcherExtras, dialogInfo, suspender, targetUserId, callingUid, quarantined); } @@ -6653,7 +6660,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService final Computer computer = snapshotComputer(); final String[] allPackages = computer.getAllAvailablePackageNames(); mSuspendPackageHelper.removeSuspensionsBySuspendingPackage(computer, allPackages, - (suspendingPackage) -> !PLATFORM_PACKAGE_NAME.equals(suspendingPackage), + (suspender) -> !PLATFORM_PACKAGE_NAME.equals(suspender.packageName), userId); } @@ -6667,8 +6674,13 @@ public class PackageManagerService implements PackageSender, TestUtilityService @Override public String[] setPackagesSuspendedByAdmin( @UserIdInt int userId, @NonNull String[] packageNames, boolean suspended) { - return mSuspendPackageHelper.setPackagesSuspendedByAdmin( - snapshotComputer(), userId, packageNames, suspended); + final int suspendingUserId = userId; + final UserPackage suspender = UserPackage.of( + suspendingUserId, PackageManagerService.PLATFORM_PACKAGE_NAME); + return mSuspendPackageHelper.setPackagesSuspended(snapshotComputer(), packageNames, + suspended, null /* appExtras */, null /* launcherExtras */, + null /* dialogInfo */, suspender, userId, Process.SYSTEM_UID, + false /* quarantined */); } @Override diff --git a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java index 322557b9e4966cf38ce898105ba77f88de055053..243fb16b19ae4eeb34e6617597f8334acdd3192e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerShellCommand.java +++ b/services/core/java/com/android/server/pm/PackageManagerShellCommand.java @@ -2827,7 +2827,7 @@ class PackageManagerShellCommand extends ShellCommand { mInterface.setPackagesSuspendedAsUser(packageNames.toArray(new String[] {}), suspendedState, ((appExtras.size() > 0) ? appExtras : null), ((launcherExtras.size() > 0) ? launcherExtras : null), - info, flags, callingPackage, translatedUserId); + info, flags, callingPackage, UserHandle.USER_SYSTEM, translatedUserId); for (int i = 0; i < packageNames.size(); i++) { final String packageName = packageNames.get(i); pw.println("Package " + packageName + " new suspended state: " diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 7d0a1f6afe1dbf1804adbdc306017c5f45460eea..28a90f3d6ab6584c950f50ffd342678b3e9d3a57 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -32,6 +32,7 @@ import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningDetails; import android.content.pm.SigningInfo; import android.content.pm.UserInfo; +import android.content.pm.UserPackage; import android.content.pm.overlay.OverlayPaths; import android.os.UserHandle; import android.os.incremental.IncrementalManager; @@ -952,7 +953,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal void setUserState(int userId, long ceDataInode, long deDataInode, int enabled, boolean installed, boolean stopped, boolean notLaunched, boolean hidden, - int distractionFlags, ArrayMap<String, SuspendParams> suspendParams, + int distractionFlags, ArrayMap<UserPackage, SuspendParams> suspendParams, boolean instantApp, boolean virtualPreload, String lastDisableAppCaller, ArraySet<String> enabledComponents, ArraySet<String> disabledComponents, int installReason, int uninstallReason, @@ -1182,7 +1183,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal if (state.isSuspended()) { for (int j = 0; j < state.getSuspendParams().size(); j++) { proto.write(PackageProto.UserInfoProto.SUSPENDING_PACKAGE, - state.getSuspendParams().keyAt(j)); + state.getSuspendParams().keyAt(j).packageName); } } proto.write(PackageProto.UserInfoProto.IS_STOPPED, state.isStopped()); diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index cfbaae3d0f30616bf734d9c024f4dd9b7dbf7306..d6952262d82ef3b642eab00382cc0ef225d61cb6 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -51,6 +51,7 @@ import android.content.pm.ResolveInfo; import android.content.pm.Signature; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; +import android.content.pm.UserPackage; import android.content.pm.VerifierDeviceIdentity; import android.content.pm.overlay.OverlayPaths; import android.net.Uri; @@ -1956,7 +1957,7 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile ArchiveState archiveState = null; int packageDepth = parser.getDepth(); - ArrayMap<String, SuspendParams> suspendParamsMap = null; + ArrayMap<UserPackage, SuspendParams> suspendParamsMap = null; while ((type = parser.next()) != XmlPullParser.END_DOCUMENT && (type != XmlPullParser.END_TAG || parser.getDepth() > packageDepth)) { @@ -1983,18 +1984,15 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile parser); break; case TAG_SUSPEND_PARAMS: - final String suspendingPackage = parser.getAttributeValue(null, - ATTR_SUSPENDING_PACKAGE); - if (suspendingPackage == null) { - Slog.wtf(TAG, "No suspendingPackage found inside tag " - + TAG_SUSPEND_PARAMS); + Map.Entry<UserPackage, SuspendParams> entry = + readSuspensionParamsLPr(userId, parser); + if (entry == null) { continue; } if (suspendParamsMap == null) { suspendParamsMap = new ArrayMap<>(); } - suspendParamsMap.put(suspendingPackage, - SuspendParams.restoreFromXml(parser)); + suspendParamsMap.put(entry.getKey(), entry.getValue()); break; case TAG_ARCHIVE_STATE: archiveState = parseArchiveState(parser); @@ -2016,7 +2014,8 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile oldSuspendedLauncherExtras, false /* quarantined */); suspendParamsMap = new ArrayMap<>(); - suspendParamsMap.put(oldSuspendingPackage, suspendParams); + suspendParamsMap.put( + UserPackage.of(userId, oldSuspendingPackage), suspendParams); } if (blockUninstall) { @@ -2058,6 +2057,20 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile } } + @Nullable + private static Map.Entry<UserPackage, SuspendParams> readSuspensionParamsLPr( + int userId, TypedXmlPullParser parser) throws IOException { + final String suspendingPackage = parser.getAttributeValue(null, ATTR_SUSPENDING_PACKAGE); + if (suspendingPackage == null) { + Slog.wtf(TAG, "No suspendingPackage found inside tag " + TAG_SUSPEND_PARAMS); + return null; + } + final int suspendingUserId = userId; + return Map.entry( + UserPackage.of(suspendingUserId, suspendingPackage), + SuspendParams.restoreFromXml(parser)); + } + private static ArchiveState parseArchiveState(TypedXmlPullParser parser) throws XmlPullParserException, IOException { String installerTitle = parser.getAttributeValue(null, @@ -2414,10 +2427,11 @@ public final class Settings implements Watchable, Snappable, ResilientAtomicFile } if (ustate.isSuspended()) { for (int i = 0; i < ustate.getSuspendParams().size(); i++) { - final String suspendingPackage = ustate.getSuspendParams().keyAt(i); + final UserPackage suspendingPackage = + ustate.getSuspendParams().keyAt(i); serializer.startTag(null, TAG_SUSPEND_PARAMS); serializer.attribute(null, ATTR_SUSPENDING_PACKAGE, - suspendingPackage); + suspendingPackage.packageName); final SuspendParams params = ustate.getSuspendParams().valueAt(i); if (params != null) { diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java index c2a960a9539436dd0b484f9f78e339c5e0c43548..4e70cc52ef90ee298da4fac19d34d24b34735bef 100644 --- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java +++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java @@ -27,10 +27,10 @@ import android.annotation.UserIdInt; import android.app.AppOpsManager; import android.content.Intent; import android.content.pm.SuspendDialogInfo; +import android.content.pm.UserPackage; import android.os.Binder; import android.os.Bundle; import android.os.PersistableBundle; -import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; @@ -88,8 +88,8 @@ public final class SuspendPackageHelper { * @param dialogInfo An optional {@link SuspendDialogInfo} object describing the dialog that * should be shown to the user when they try to launch a suspended app. * Ignored if {@code suspended} is false. - * @param callingPackage The caller's package name. - * @param userId The user where packages reside. + * @param suspendingPackage The caller's package name. + * @param targetUserId The user where packages reside. * @param callingUid The caller's uid. * @return The names of failed packages. */ @@ -97,14 +97,14 @@ public final class SuspendPackageHelper { String[] setPackagesSuspended(@NonNull Computer snapshot, @Nullable String[] packageNames, boolean suspended, @Nullable PersistableBundle appExtras, @Nullable PersistableBundle launcherExtras, @Nullable SuspendDialogInfo dialogInfo, - @NonNull String callingPackage, @UserIdInt int userId, int callingUid, + @NonNull UserPackage suspendingPackage, @UserIdInt int targetUserId, int callingUid, boolean quarantined) { if (ArrayUtils.isEmpty(packageNames)) { return packageNames; } - if (suspended && !quarantined && !isSuspendAllowedForUser(snapshot, userId, - callingUid)) { - Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); + if (suspended && !quarantined + && !isSuspendAllowedForUser(snapshot, targetUserId, callingUid)) { + Slog.w(TAG, "Cannot suspend due to restrictions on user " + targetUserId); return packageNames; } @@ -119,19 +119,21 @@ public final class SuspendPackageHelper { final IntArray changedUids = new IntArray(packageNames.length); final boolean[] canSuspend = suspended - ? canSuspendPackageForUser(snapshot, packageNames, userId, callingUid) + ? canSuspendPackageForUser(snapshot, packageNames, targetUserId, callingUid) : null; for (int i = 0; i < packageNames.length; i++) { final String packageName = packageNames[i]; - if (callingPackage.equals(packageName)) { - Slog.w(TAG, "Calling package: " + callingPackage + " trying to " + if (suspendingPackage.packageName.equals(packageName) + && suspendingPackage.userId == targetUserId) { + Slog.w(TAG, "Suspending package: " + suspendingPackage + " trying to " + (suspended ? "" : "un") + "suspend itself. Ignoring"); unmodifiablePackages.add(packageName); continue; } final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); - if (packageState == null || !packageState.getUserStateOrDefault(userId).isInstalled() - || snapshot.shouldFilterApplication(packageState, callingUid, userId)) { + if (packageState == null + || !packageState.getUserStateOrDefault(targetUserId).isInstalled() + || snapshot.shouldFilterApplication(packageState, callingUid, targetUserId)) { Slog.w(TAG, "Could not find package setting for package: " + packageName + ". Skipping suspending/un-suspending."); unmodifiablePackages.add(packageName); @@ -142,34 +144,34 @@ public final class SuspendPackageHelper { continue; } - final WatchedArrayMap<String, SuspendParams> suspendParamsMap = - packageState.getUserStateOrDefault(userId).getSuspendParams(); + final WatchedArrayMap<UserPackage, SuspendParams> suspendParamsMap = + packageState.getUserStateOrDefault(targetUserId).getSuspendParams(); final SuspendParams oldSuspendParams = suspendParamsMap == null - ? null : suspendParamsMap.get(callingPackage); + ? null : suspendParamsMap.get(suspendingPackage); boolean changed = !Objects.equals(oldSuspendParams, newSuspendParams); if (suspended && !changed) { // Carried over API behavior, must notify change even if no change notifyPackagesList.add(packageName); notifyUids.add( - UserHandle.getUid(userId, packageState.getAppId())); + UserHandle.getUid(targetUserId, packageState.getAppId())); continue; } - // If only the callingPackage is suspending this package, + // If only the suspendingPackage is suspending this package, // it will be unsuspended when this change is committed boolean packageUnsuspended = !suspended && CollectionUtils.size(suspendParamsMap) == 1 - && suspendParamsMap.containsKey(callingPackage); + && suspendParamsMap.containsKey(suspendingPackage); if (suspended || packageUnsuspended) { // Always notify of a suspend call + notify when fully unsuspended notifyPackagesList.add(packageName); - notifyUids.add(UserHandle.getUid(userId, packageState.getAppId())); + notifyUids.add(UserHandle.getUid(targetUserId, packageState.getAppId())); } if (changed) { changedPackagesList.add(packageName); - changedUids.add(UserHandle.getUid(userId, packageState.getAppId())); + changedUids.add(UserHandle.getUid(targetUserId, packageState.getAppId())); } else { Slog.w(TAG, "No change is needed for package: " + packageName + ". Skipping suspending/un-suspending."); @@ -181,11 +183,11 @@ public final class SuspendPackageHelper { for (int index = 0; index < size; index++) { final String packageName = changedPackagesList.valueAt(index); final PackageUserStateWrite userState = mutator.forPackage(packageName) - .userState(userId); + .userState(targetUserId); if (suspended) { - userState.putSuspendParams(callingPackage, newSuspendParams); + userState.putSuspendParams(suspendingPackage, newSuspendParams); } else { - userState.removeSuspension(callingPackage); + userState.removeSuspension(suspendingPackage); } } }); @@ -197,17 +199,17 @@ public final class SuspendPackageHelper { mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, suspended ? Intent.ACTION_PACKAGES_SUSPENDED : Intent.ACTION_PACKAGES_UNSUSPENDED, - changedPackages, notifyUids.toArray(), quarantined, userId); + changedPackages, notifyUids.toArray(), quarantined, targetUserId); mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(newSnapshot, changedPackages, - suspended, userId); - mPm.scheduleWritePackageRestrictions(userId); + suspended, targetUserId); + mPm.scheduleWritePackageRestrictions(targetUserId); } // Send the suspension changed broadcast to ensure suspension state is not stale. if (!changedPackagesList.isEmpty()) { mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_SUSPENSION_CHANGED, changedPackagesList.toArray(new String[0]), changedUids.toArray(), quarantined, - userId); + targetUserId); } return unmodifiablePackages.toArray(new String[0]); } @@ -216,19 +218,19 @@ public final class SuspendPackageHelper { * Returns the names in the {@code packageNames} which can not be suspended by the caller. * * @param packageNames The names of packages to check. - * @param userId The user where packages reside. + * @param targetUserId The user where packages reside. * @param callingUid The caller's uid. * @return The names of packages which are Unsuspendable. */ @NonNull String[] getUnsuspendablePackagesForUser(@NonNull Computer snapshot, - @NonNull String[] packageNames, @UserIdInt int userId, int callingUid) { - if (!isSuspendAllowedForUser(snapshot, userId, callingUid)) { - Slog.w(TAG, "Cannot suspend due to restrictions on user " + userId); + @NonNull String[] packageNames, @UserIdInt int targetUserId, int callingUid) { + if (!isSuspendAllowedForUser(snapshot, targetUserId, callingUid)) { + Slog.w(TAG, "Cannot suspend due to restrictions on user " + targetUserId); return packageNames; } final ArraySet<String> unactionablePackages = new ArraySet<>(); - final boolean[] canSuspend = canSuspendPackageForUser(snapshot, packageNames, userId, + final boolean[] canSuspend = canSuspendPackageForUser(snapshot, packageNames, targetUserId, callingUid); for (int i = 0; i < packageNames.length; i++) { if (!canSuspend[i]) { @@ -237,7 +239,7 @@ public final class SuspendPackageHelper { } final PackageStateInternal packageState = snapshot.getPackageStateForInstalledAndFiltered( - packageNames[i], callingUid, userId); + packageNames[i], callingUid, targetUserId); if (packageState == null) { Slog.w(TAG, "Could not find package setting for package: " + packageNames[i]); unactionablePackages.add(packageNames[i]); @@ -285,30 +287,31 @@ public final class SuspendPackageHelper { * @param packagesToChange The packages on which the suspension are to be removed. * @param suspendingPackagePredicate A predicate identifying the suspending packages whose * suspensions will be removed. - * @param userId The user for which the changes are taking place. + * @param targetUserId The user for which the changes are taking place. */ void removeSuspensionsBySuspendingPackage(@NonNull Computer snapshot, @NonNull String[] packagesToChange, - @NonNull Predicate<String> suspendingPackagePredicate, int userId) { + @NonNull Predicate<UserPackage> suspendingPackagePredicate, int targetUserId) { final List<String> unsuspendedPackages = new ArrayList<>(); final IntArray unsuspendedUids = new IntArray(); - final ArrayMap<String, ArraySet<String>> pkgToSuspendingPkgsToCommit = new ArrayMap<>(); + final ArrayMap<String, ArraySet<UserPackage>> pkgToSuspendingPkgsToCommit = + new ArrayMap<>(); for (String packageName : packagesToChange) { final PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); final PackageUserStateInternal packageUserState = packageState == null - ? null : packageState.getUserStateOrDefault(userId); + ? null : packageState.getUserStateOrDefault(targetUserId); if (packageUserState == null || !packageUserState.isSuspended()) { continue; } - WatchedArrayMap<String, SuspendParams> suspendParamsMap = + WatchedArrayMap<UserPackage, SuspendParams> suspendParamsMap = packageUserState.getSuspendParams(); int countRemoved = 0; for (int index = 0; index < suspendParamsMap.size(); index++) { - String suspendingPackage = suspendParamsMap.keyAt(index); + UserPackage suspendingPackage = suspendParamsMap.keyAt(index); if (suspendingPackagePredicate.test(suspendingPackage)) { - ArraySet<String> suspendingPkgsToCommit = + ArraySet<UserPackage> suspendingPkgsToCommit = pkgToSuspendingPkgsToCommit.get(packageName); if (suspendingPkgsToCommit == null) { suspendingPkgsToCommit = new ArraySet<>(); @@ -322,31 +325,33 @@ public final class SuspendPackageHelper { // Everything would be removed and package unsuspended if (countRemoved == suspendParamsMap.size()) { unsuspendedPackages.add(packageState.getPackageName()); - unsuspendedUids.add(UserHandle.getUid(userId, packageState.getAppId())); + unsuspendedUids.add(UserHandle.getUid(targetUserId, packageState.getAppId())); } } mPm.commitPackageStateMutation(null, mutator -> { for (int mapIndex = 0; mapIndex < pkgToSuspendingPkgsToCommit.size(); mapIndex++) { String packageName = pkgToSuspendingPkgsToCommit.keyAt(mapIndex); - ArraySet<String> packagesToRemove = pkgToSuspendingPkgsToCommit.valueAt(mapIndex); - PackageUserStateWrite userState = mutator.forPackage(packageName).userState(userId); + ArraySet<UserPackage> packagesToRemove = + pkgToSuspendingPkgsToCommit.valueAt(mapIndex); + PackageUserStateWrite userState = + mutator.forPackage(packageName).userState(targetUserId); for (int setIndex = 0; setIndex < packagesToRemove.size(); setIndex++) { userState.removeSuspension(packagesToRemove.valueAt(setIndex)); } } }); - mPm.scheduleWritePackageRestrictions(userId); + mPm.scheduleWritePackageRestrictions(targetUserId); final Computer newSnapshot = mPm.snapshotComputer(); if (!unsuspendedPackages.isEmpty()) { final String[] packageArray = unsuspendedPackages.toArray( new String[unsuspendedPackages.size()]); mBroadcastHelper.sendMyPackageSuspendedOrUnsuspended(newSnapshot, packageArray, - false, userId); + false, targetUserId); mBroadcastHelper.sendPackagesSuspendedOrUnsuspendedForUser(newSnapshot, Intent.ACTION_PACKAGES_UNSUSPENDED, - packageArray, unsuspendedUids.toArray(), false, userId); + packageArray, unsuspendedUids.toArray(), false, targetUserId); } } @@ -404,7 +409,7 @@ public final class SuspendPackageHelper { * @return The name of suspending package. */ @Nullable - String getSuspendingPackage(@NonNull Computer snapshot, @NonNull String suspendedPackage, + UserPackage getSuspendingPackage(@NonNull Computer snapshot, @NonNull String suspendedPackage, int userId, int callingUid) { final PackageStateInternal packageState = snapshot.getPackageStateInternal( suspendedPackage, callingUid); @@ -417,13 +422,13 @@ public final class SuspendPackageHelper { return null; } - String suspendingPackage = null; - String suspendedBySystem = null; - String qasPackage = null; + UserPackage suspendingPackage = null; + UserPackage suspendedBySystem = null; + UserPackage qasPackage = null; for (int i = 0; i < userState.getSuspendParams().size(); i++) { suspendingPackage = userState.getSuspendParams().keyAt(i); var suspendParams = userState.getSuspendParams().valueAt(i); - if (PLATFORM_PACKAGE_NAME.equals(suspendingPackage)) { + if (PLATFORM_PACKAGE_NAME.equals(suspendingPackage.packageName)) { suspendedBySystem = suspendingPackage; } if (suspendParams.isQuarantined() && qasPackage == null) { @@ -451,7 +456,7 @@ public final class SuspendPackageHelper { */ @Nullable SuspendDialogInfo getSuspendedDialogInfo(@NonNull Computer snapshot, - @NonNull String suspendedPackage, @NonNull String suspendingPackage, int userId, + @NonNull String suspendedPackage, @NonNull UserPackage suspendingPackage, int userId, int callingUid) { final PackageStateInternal packageState = snapshot.getPackageStateInternal( suspendedPackage, callingUid); @@ -464,7 +469,7 @@ public final class SuspendPackageHelper { return null; } - final WatchedArrayMap<String, SuspendParams> suspendParamsMap = + final WatchedArrayMap<UserPackage, SuspendParams> suspendParamsMap = userState.getSuspendParams(); if (suspendParamsMap == null) { return null; @@ -493,34 +498,36 @@ public final class SuspendPackageHelper { * be suspended or not. * * @param packageNames The package names to check suspendability for. - * @param userId The user to check in + * @param targetUserId The user to check in * @param callingUid The caller's uid. * @return An array containing results of the checks */ @NonNull boolean[] canSuspendPackageForUser(@NonNull Computer snapshot, @NonNull String[] packageNames, - int userId, int callingUid) { + int targetUserId, int callingUid) { final boolean[] canSuspend = new boolean[packageNames.length]; - final boolean isCallerOwner = isCallerDeviceOrProfileOwner(snapshot, userId, callingUid); + final boolean isCallerOwner = + isCallerDeviceOrProfileOwner(snapshot, targetUserId, callingUid); final long token = Binder.clearCallingIdentity(); try { final DefaultAppProvider defaultAppProvider = mInjector.getDefaultAppProvider(); - final String activeLauncherPackageName = defaultAppProvider.getDefaultHome(userId); - final String dialerPackageName = defaultAppProvider.getDefaultDialer(userId); + final String activeLauncherPackageName = + defaultAppProvider.getDefaultHome(targetUserId); + final String dialerPackageName = defaultAppProvider.getDefaultDialer(targetUserId); final String requiredInstallerPackage = - getKnownPackageName(snapshot, KnownPackages.PACKAGE_INSTALLER, userId); + getKnownPackageName(snapshot, KnownPackages.PACKAGE_INSTALLER, targetUserId); final String requiredUninstallerPackage = - getKnownPackageName(snapshot, KnownPackages.PACKAGE_UNINSTALLER, userId); + getKnownPackageName(snapshot, KnownPackages.PACKAGE_UNINSTALLER, targetUserId); final String requiredVerifierPackage = - getKnownPackageName(snapshot, KnownPackages.PACKAGE_VERIFIER, userId); + getKnownPackageName(snapshot, KnownPackages.PACKAGE_VERIFIER, targetUserId); final String requiredPermissionControllerPackage = getKnownPackageName(snapshot, KnownPackages.PACKAGE_PERMISSION_CONTROLLER, - userId); + targetUserId); for (int i = 0; i < packageNames.length; i++) { canSuspend[i] = false; final String packageName = packageNames[i]; - if (mPm.isPackageDeviceAdmin(packageName, userId)) { + if (mPm.isPackageDeviceAdmin(packageName, targetUserId)) { Slog.w(TAG, "Cannot suspend package \"" + packageName + "\": has an active device admin"); continue; @@ -555,12 +562,12 @@ public final class SuspendPackageHelper { + "\": required for permissions management"); continue; } - if (mProtectedPackages.isPackageStateProtected(userId, packageName)) { + if (mProtectedPackages.isPackageStateProtected(targetUserId, packageName)) { Slog.w(TAG, "Cannot suspend package \"" + packageName + "\": protected package"); continue; } - if (!isCallerOwner && snapshot.getBlockUninstall(userId, packageName)) { + if (!isCallerOwner && snapshot.getBlockUninstall(targetUserId, packageName)) { Slog.w(TAG, "Cannot suspend package \"" + packageName + "\": blocked by admin"); continue; @@ -572,7 +579,7 @@ public final class SuspendPackageHelper { PackageStateInternal packageState = snapshot.getPackageStateInternal(packageName); AndroidPackage pkg = packageState == null ? null : packageState.getPkg(); if (pkg != null) { - final int uid = UserHandle.getUid(userId, packageState.getAppId()); + final int uid = UserHandle.getUid(targetUserId, packageState.getAppId()); // Cannot suspend SDK libs as they are controlled by SDK manager. if (pkg.isSdkLibrary()) { Slog.w(TAG, "Cannot suspend package: " + packageName @@ -614,20 +621,6 @@ public final class SuspendPackageHelper { == AppOpsManager.MODE_ALLOWED; } - /** - * Suspends packages on behalf of an admin. - * - * @return array of packages that are unsuspendable, either because admin is not allowed to - * suspend them (e.g. current dialer) or there was other problem (e.g. package not found). - */ - public String[] setPackagesSuspendedByAdmin( - Computer snapshot, int userId, String[] packageNames, boolean suspend) { - return setPackagesSuspended(snapshot, packageNames, suspend, - null /* appExtras */, null /* launcherExtras */, null /* dialogInfo */, - PackageManagerService.PLATFORM_PACKAGE_NAME, userId, Process.SYSTEM_UID, - false /* quarantined */); - } - private String getKnownPackageName(@NonNull Computer snapshot, @KnownPackages.KnownPackage int knownPackage, int userId) { final String[] knownPackages = @@ -635,14 +628,15 @@ public final class SuspendPackageHelper { return knownPackages.length > 0 ? knownPackages[0] : null; } - private boolean isCallerDeviceOrProfileOwner(@NonNull Computer snapshot, int userId, + private boolean isCallerDeviceOrProfileOwner(@NonNull Computer snapshot, int targetUserId, int callingUid) { if (callingUid == SYSTEM_UID) { return true; } - final String ownerPackage = mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(userId); + final String ownerPackage = + mProtectedPackages.getDeviceOwnerOrProfileOwnerPackage(targetUserId); if (ownerPackage != null) { - return callingUid == snapshot.getPackageUidInternal(ownerPackage, 0, userId, + return callingUid == snapshot.getPackageUidInternal(ownerPackage, 0, targetUserId, callingUid); } return false; diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java index 2f4ad2d8fcc62ee17536482901f21d6ce384494a..15b693cf72f8c294eb4b59d193293fd8e90b9b6a 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.pm.PackageManager; +import android.content.pm.UserPackage; import android.content.pm.overlay.OverlayPaths; import android.util.ArraySet; import android.util.Pair; @@ -173,7 +174,7 @@ class PackageUserStateDefault implements PackageUserStateInternal { @Nullable @Override - public WatchedArrayMap<String, SuspendParams> getSuspendParams() { + public WatchedArrayMap<UserPackage, SuspendParams> getSuspendParams() { return null; } diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java index c5ef5257ddd5405f4deee14da3e63c75e898a81f..7a5a14d8d3c21f81af26893d9561531e2db290ab 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java @@ -22,6 +22,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.pm.PackageManager; +import android.content.pm.UserPackage; import android.content.pm.overlay.OverlayPaths; import android.text.TextUtils; import android.util.ArrayMap; @@ -121,7 +122,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt * Suspending package to suspend params */ @Nullable - private WatchedArrayMap<String, SuspendParams> mSuspendParams; + private WatchedArrayMap<UserPackage, SuspendParams> mSuspendParams; @Nullable private WatchedArrayMap<ComponentName, Pair<String, Integer>> mComponentLabelIconOverrideMap; @@ -369,7 +370,10 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt return !CollectionUtils.isEmpty(mSuspendParams); } - public PackageUserStateImpl putSuspendParams(@NonNull String suspendingPackage, + /** + * Adds or updates suspension params by the given package. + */ + public PackageUserStateImpl putSuspendParams(@NonNull UserPackage suspendingPackage, @Nullable SuspendParams suspendParams) { if (mSuspendParams == null) { mSuspendParams = new WatchedArrayMap<>(); @@ -384,7 +388,10 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt return this; } - public PackageUserStateImpl removeSuspension(@NonNull String suspendingPackage) { + /** + * Removes suspension by the given package. + */ + public PackageUserStateImpl removeSuspension(@NonNull UserPackage suspendingPackage) { if (mSuspendParams != null) { mSuspendParams.remove(suspendingPackage); onChanged(); @@ -565,7 +572,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt * Suspending package to suspend params */ public @NonNull PackageUserStateImpl setSuspendParams( - @NonNull ArrayMap<String, SuspendParams> value) { + @NonNull ArrayMap<UserPackage, SuspendParams> value) { if (value == null) { return this; } @@ -778,7 +785,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt * Suspending package to suspend params */ @DataClass.Generated.Member - public @Nullable WatchedArrayMap<String,SuspendParams> getSuspendParams() { + public @Nullable WatchedArrayMap<UserPackage,SuspendParams> getSuspendParams() { return mSuspendParams; } @@ -830,7 +837,7 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt * Suspending package to suspend params */ @DataClass.Generated.Member - public @NonNull PackageUserStateImpl setSuspendParams(@NonNull WatchedArrayMap<String,SuspendParams> value) { + public @NonNull PackageUserStateImpl setSuspendParams(@NonNull WatchedArrayMap<UserPackage,SuspendParams> value) { mSuspendParams = value; return this; } @@ -909,10 +916,10 @@ public class PackageUserStateImpl extends WatchableImpl implements PackageUserSt } @DataClass.Generated( - time = 1701470095849L, + time = 1701864813354L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java", - inputSignatures = "private int mBooleans\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate long mDeDataInode\nprivate int mDistractionFlags\nprivate @android.content.pm.PackageManager.EnabledState int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.content.pm.PackageManager.UserMinAspectRatio int mMinAspectRatio\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate @android.annotation.CurrentTimeMillisLong long mFirstInstallTimeMillis\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nprivate @android.annotation.Nullable com.android.server.pm.pkg.ArchiveState mArchiveState\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(java.lang.String,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setMinAspectRatio(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTimeMillis(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setArchiveState(com.android.server.pm.pkg.ArchiveState)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setWatchable(com.android.server.utils.Watchable)\nprivate boolean watchableEquals(com.android.server.utils.Watchable)\nprivate int watchableHashCode()\nprivate boolean snapshotEquals(com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl>)\nprivate int snapshotHashCode()\npublic @java.lang.Override boolean isInstalled()\npublic @java.lang.Override boolean isStopped()\npublic @java.lang.Override boolean isNotLaunched()\npublic @java.lang.Override boolean isHidden()\npublic @java.lang.Override boolean isInstantApp()\npublic @java.lang.Override boolean isVirtualPreload()\npublic @java.lang.Override boolean isQuarantined()\npublic @java.lang.Override boolean dataExists()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\nprivate static final int INSTALLED\nprivate static final int STOPPED\nprivate static final int NOT_LAUNCHED\nprivate static final int HIDDEN\nprivate static final int INSTANT_APP\nprivate static final int VIRTUAL_PRELOADED\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)") + inputSignatures = "private int mBooleans\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate long mDeDataInode\nprivate int mDistractionFlags\nprivate @android.content.pm.PackageManager.EnabledState int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.content.pm.PackageManager.UserMinAspectRatio int mMinAspectRatio\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.pm.UserPackage,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate @android.annotation.CurrentTimeMillisLong long mFirstInstallTimeMillis\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nprivate @android.annotation.Nullable com.android.server.pm.pkg.ArchiveState mArchiveState\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(android.content.pm.UserPackage,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(android.content.pm.UserPackage)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setMinAspectRatio(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<android.content.pm.UserPackage,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTimeMillis(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setArchiveState(com.android.server.pm.pkg.ArchiveState)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setWatchable(com.android.server.utils.Watchable)\nprivate boolean watchableEquals(com.android.server.utils.Watchable)\nprivate int watchableHashCode()\nprivate boolean snapshotEquals(com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl>)\nprivate int snapshotHashCode()\npublic @java.lang.Override boolean isInstalled()\npublic @java.lang.Override boolean isStopped()\npublic @java.lang.Override boolean isNotLaunched()\npublic @java.lang.Override boolean isHidden()\npublic @java.lang.Override boolean isInstantApp()\npublic @java.lang.Override boolean isVirtualPreload()\npublic @java.lang.Override boolean isQuarantined()\npublic @java.lang.Override boolean dataExists()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\nprivate static final int INSTALLED\nprivate static final int STOPPED\nprivate static final int NOT_LAUNCHED\nprivate static final int HIDDEN\nprivate static final int INSTANT_APP\nprivate static final int VIRTUAL_PRELOADED\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)") @Deprecated private void __metadata() {} diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserStateInternal.java b/services/core/java/com/android/server/pm/pkg/PackageUserStateInternal.java index 46cc830130efcde5ddcd01bd452ae45f52bd8bbe..f8d745cb7fbfedf5e9f8e7d379d673374dbefe22 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateInternal.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateInternal.java @@ -19,6 +19,7 @@ package com.android.server.pm.pkg; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; +import android.content.pm.UserPackage; import android.content.pm.pkg.FrameworkPackageUserState; import android.util.Pair; @@ -38,7 +39,7 @@ public interface PackageUserStateInternal extends PackageUserState, FrameworkPac // TODO: Make non-null with emptyMap() @Nullable - WatchedArrayMap<String, SuspendParams> getSuspendParams(); + WatchedArrayMap<UserPackage, SuspendParams> getSuspendParams(); @Nullable WatchedArraySet<String> getDisabledComponentsNoCopy(); diff --git a/services/core/java/com/android/server/pm/pkg/mutate/PackageStateMutator.java b/services/core/java/com/android/server/pm/pkg/mutate/PackageStateMutator.java index 8430cf7a0d11f1a9b059cb7b3a5e3e9267bfebcf..253eb400612289d772f5a343bb32c5528efd4b31 100644 --- a/services/core/java/com/android/server/pm/pkg/mutate/PackageStateMutator.java +++ b/services/core/java/com/android/server/pm/pkg/mutate/PackageStateMutator.java @@ -21,6 +21,7 @@ import android.annotation.Nullable; import android.content.ComponentName; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; +import android.content.pm.UserPackage; import android.content.pm.overlay.OverlayPaths; import android.util.ArraySet; @@ -349,7 +350,7 @@ public class PackageStateMutator { @NonNull @Override - public PackageUserStateWrite putSuspendParams(@NonNull String suspendingPackage, + public PackageUserStateWrite putSuspendParams(@NonNull UserPackage suspendingPackage, @Nullable SuspendParams suspendParams) { if (mUserState != null) { mUserState.putSuspendParams(suspendingPackage, suspendParams); @@ -359,7 +360,7 @@ public class PackageStateMutator { @NonNull @Override - public PackageUserStateWrite removeSuspension(@NonNull String suspendingPackage) { + public PackageUserStateWrite removeSuspension(@NonNull UserPackage suspendingPackage) { if (mUserState != null) { mUserState.removeSuspension(suspendingPackage); } diff --git a/services/core/java/com/android/server/pm/pkg/mutate/PackageUserStateWrite.java b/services/core/java/com/android/server/pm/pkg/mutate/PackageUserStateWrite.java index 0c6c6723b79bb301b60c82a8151a9072175603ca..f6b21045a8bb3e43bee59f9c91b24918b8f754ae 100644 --- a/services/core/java/com/android/server/pm/pkg/mutate/PackageUserStateWrite.java +++ b/services/core/java/com/android/server/pm/pkg/mutate/PackageUserStateWrite.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.pm.PackageManager; +import android.content.pm.UserPackage; import android.content.pm.overlay.OverlayPaths; import com.android.server.pm.pkg.PackageUserStateImpl; @@ -38,11 +39,11 @@ public interface PackageUserStateWrite { @PackageManager.DistractionRestriction int restrictionFlags); @NonNull - PackageUserStateWrite putSuspendParams(@NonNull String suspendingPackage, + PackageUserStateWrite putSuspendParams(@NonNull UserPackage suspendingPackage, @Nullable SuspendParams suspendParams); @NonNull - PackageUserStateWrite removeSuspension(@NonNull String suspendingPackage); + PackageUserStateWrite removeSuspension(@NonNull UserPackage suspendingPackage); @NonNull PackageUserStateWrite setHidden(boolean hidden); diff --git a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java index f9d344bd7e31e4a557fe47faad2596d8c35b43b3..1b45c1b4f3f105cd7c9ac4a57ea5e2ded1909ddb 100644 --- a/services/core/java/com/android/server/wm/ActivityStartInterceptor.java +++ b/services/core/java/com/android/server/wm/ActivityStartInterceptor.java @@ -48,6 +48,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.ResolveInfo; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; +import android.content.pm.UserPackage; import android.os.Bundle; import android.os.IBinder; import android.os.RemoteException; @@ -335,19 +336,19 @@ class ActivityStartInterceptor { return false; } final String suspendedPackage = mAInfo.applicationInfo.packageName; - final String suspendingPackage = pmi.getSuspendingPackage(suspendedPackage, mUserId); - if (PLATFORM_PACKAGE_NAME.equals(suspendingPackage)) { + final UserPackage suspender = pmi.getSuspendingPackage(suspendedPackage, mUserId); + if (suspender != null && PLATFORM_PACKAGE_NAME.equals(suspender.packageName)) { return interceptSuspendedByAdminPackage(); } final SuspendDialogInfo dialogInfo = pmi.getSuspendedDialogInfo(suspendedPackage, - suspendingPackage, mUserId); + suspender, mUserId); final Bundle crossProfileOptions = hasCrossProfileAnimation() ? ActivityOptions.makeOpenCrossProfileAppsAnimation().toBundle() : null; final IntentSender target = createIntentSenderForOriginalIntent(mCallingUid, FLAG_IMMUTABLE); mIntent = SuspendedAppActivity.createSuspendedAppInterceptIntent(suspendedPackage, - suspendingPackage, dialogInfo, crossProfileOptions, target, mUserId); + suspender, dialogInfo, crossProfileOptions, target, mUserId); mCallingPid = mRealCallingPid; mCallingUid = mRealCallingUid; mResolvedType = null; diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index e0a2f30b18310ebf75a62ba31330367d676ecd10..a490013303e95ae68500c08fe97882167d1376c5 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -2469,7 +2469,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { private void migratePersonalAppSuspensionLocked( int doUserId, int poUserId, ActiveAdmin poAdmin) { final PackageManagerInternal pmi = mInjector.getPackageManagerInternal(); - if (!pmi.isSuspendingAnyPackages(PLATFORM_PACKAGE_NAME, doUserId)) { + if (!pmi.isAdminSuspendingAnyPackages(doUserId)) { Slogf.i(LOG_TAG, "DO is not suspending any apps."); return; } @@ -2480,7 +2480,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { poAdmin.mSuspendPersonalApps = true; } else { Slogf.i(LOG_TAG, "PO isn't targeting R+, unsuspending personal apps."); - pmi.unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, doUserId); + pmi.unsuspendAdminSuspendedPackages(doUserId); } } diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java index 6570ce1cd500c6ce1df177cc389714ea97d8e734..506dbe8c48c4adc8f65719ccf74684296340d3ad 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/PolicyEnforcerCallbacks.java @@ -16,8 +16,6 @@ package com.android.server.devicepolicy; -import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; - import android.annotation.NonNull; import android.annotation.Nullable; import android.app.AppGlobals; @@ -287,7 +285,7 @@ final class PolicyEnforcerCallbacks { suspendPersonalAppsInPackageManager(context, userId); } else { LocalServices.getService(PackageManagerInternal.class) - .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, userId); + .unsuspendAdminSuspendedPackages(userId); } }); return true; diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java index 3d0b389aa171411b8454a3b465c28dc41d278f82..40d3d5ca9fd9d2bcd5ec4233725654a0ff238efb 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageManagerSettingsTests.java @@ -50,6 +50,7 @@ import android.content.pm.PackageManager; import android.content.pm.SharedLibraryInfo; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; +import android.content.pm.UserPackage; import android.os.BaseBundle; import android.os.Message; import android.os.PersistableBundle; @@ -425,7 +426,7 @@ public class PackageManagerSettingsTests { PackageUserStateInternal packageUserState1 = ps1.readUserState(0); assertThat(packageUserState1.isSuspended(), is(true)); assertThat(packageUserState1.getSuspendParams().size(), is(1)); - assertThat(packageUserState1.getSuspendParams().keyAt(0), is("android")); + assertThat(packageUserState1.getSuspendParams().keyAt(0), is(UserPackage.of(0, "android"))); assertThat(packageUserState1.getSuspendParams().valueAt(0).getAppExtras(), is(nullValue())); assertThat(packageUserState1.getSuspendParams().valueAt(0).getDialogInfo(), is(nullValue())); @@ -437,7 +438,7 @@ public class PackageManagerSettingsTests { packageUserState1 = ps1.readUserState(0); assertThat(packageUserState1.isSuspended(), is(true)); assertThat(packageUserState1.getSuspendParams().size(), is(1)); - assertThat(packageUserState1.getSuspendParams().keyAt(0), is("android")); + assertThat(packageUserState1.getSuspendParams().keyAt(0), is(UserPackage.of(0, "android"))); assertThat(packageUserState1.getSuspendParams().valueAt(0).getAppExtras(), is(nullValue())); assertThat(packageUserState1.getSuspendParams().valueAt(0).getDialogInfo(), is(nullValue())); @@ -472,7 +473,8 @@ public class PackageManagerSettingsTests { watcher.verifyNoChangeReported("readUserState"); assertThat(packageUserState1.isSuspended(), is(true)); assertThat(packageUserState1.getSuspendParams().size(), is(1)); - assertThat(packageUserState1.getSuspendParams().keyAt(0), is(PACKAGE_NAME_3)); + assertThat(packageUserState1.getSuspendParams().keyAt(0), + is(UserPackage.of(0, PACKAGE_NAME_3))); final SuspendParams params = packageUserState1.getSuspendParams().valueAt(0); watcher.verifyNoChangeReported("fetch user state"); assertThat(params, is(notNullValue())); @@ -523,19 +525,24 @@ public class PackageManagerSettingsTests { .setNeutralButtonAction(BUTTON_ACTION_UNSUSPEND) .build(); - ps1.modifyUserState(0).putSuspendParams("suspendingPackage1", + UserPackage suspender1 = UserPackage.of(0, "suspendingPackage1"); + UserPackage suspender2 = UserPackage.of(0, "suspendingPackage2"); + UserPackage suspender3 = UserPackage.of(0, "suspendingPackage3"); + UserPackage irrelevantSuspender = UserPackage.of(0, "irrelevant"); + + ps1.modifyUserState(0).putSuspendParams(suspender1, new SuspendParams(dialogInfo1, appExtras1, launcherExtras1)); - ps1.modifyUserState(0).putSuspendParams("suspendingPackage2", + ps1.modifyUserState(0).putSuspendParams(suspender2, new SuspendParams(dialogInfo2, appExtras2, launcherExtras2)); settingsUnderTest.mPackages.put(PACKAGE_NAME_1, ps1); watcher.verifyChangeReported("put package 1"); - ps2.modifyUserState(0).putSuspendParams("suspendingPackage3", + ps2.modifyUserState(0).putSuspendParams(suspender3, new SuspendParams(null, appExtras1, null)); settingsUnderTest.mPackages.put(PACKAGE_NAME_2, ps2); watcher.verifyChangeReported("put package 2"); - ps3.modifyUserState(0).removeSuspension("irrelevant"); + ps3.modifyUserState(0).removeSuspension(irrelevantSuspender); settingsUnderTest.mPackages.put(PACKAGE_NAME_3, ps3); watcher.verifyChangeReported("put package 3"); @@ -560,7 +567,7 @@ public class PackageManagerSettingsTests { assertThat(readPus1.getSuspendParams().size(), is(2)); watcher.verifyNoChangeReported("read package param"); - assertThat(readPus1.getSuspendParams().keyAt(0), is("suspendingPackage1")); + assertThat(readPus1.getSuspendParams().keyAt(0), is(suspender1)); final SuspendParams params11 = readPus1.getSuspendParams().valueAt(0); watcher.verifyNoChangeReported("read package param"); assertThat(params11, is(notNullValue())); @@ -570,7 +577,7 @@ public class PackageManagerSettingsTests { is(true)); watcher.verifyNoChangeReported("read package param"); - assertThat(readPus1.getSuspendParams().keyAt(1), is("suspendingPackage2")); + assertThat(readPus1.getSuspendParams().keyAt(1), is(suspender2)); final SuspendParams params12 = readPus1.getSuspendParams().valueAt(1); assertThat(params12, is(notNullValue())); assertThat(params12.getDialogInfo(), is(dialogInfo2)); @@ -583,7 +590,7 @@ public class PackageManagerSettingsTests { .readUserState(0); assertThat(readPus2.isSuspended(), is(true)); assertThat(readPus2.getSuspendParams().size(), is(1)); - assertThat(readPus2.getSuspendParams().keyAt(0), is("suspendingPackage3")); + assertThat(readPus2.getSuspendParams().keyAt(0), is(suspender3)); final SuspendParams params21 = readPus2.getSuspendParams().valueAt(0); assertThat(params21, is(notNullValue())); assertThat(params21.getDialogInfo(), is(nullValue())); @@ -1134,7 +1141,8 @@ public class PackageManagerSettingsTests { .setNeutralButtonText(0x11220003) .setNeutralButtonAction(BUTTON_ACTION_MORE_DETAILS) .build(); - origPkgSetting01.modifyUserState(0).putSuspendParams("suspendingPackage1", + origPkgSetting01.modifyUserState(0).putSuspendParams( + UserPackage.of(0, "suspendingPackage1"), new SuspendParams(dialogInfo1, appExtras1, launcherExtras1)); origPkgSetting01.setPkg(mockAndroidPackage(origPkgSetting01)); final PackageSetting testPkgSetting01 = new PackageSetting( diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java index c0c70321c79b5be73f27a5362a4d20e125792950..978044045ab3aa33322a6e07d6d0b288c39f7787 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/PackageUserStateTest.java @@ -27,6 +27,7 @@ import static org.junit.Assert.assertTrue; import android.content.ComponentName; import android.content.pm.PackageManager; import android.content.pm.SuspendDialogInfo; +import android.content.pm.UserPackage; import android.content.pm.overlay.OverlayPaths; import android.os.PersistableBundle; import android.platform.test.annotations.Presubmit; @@ -89,7 +90,7 @@ public class PackageUserStateTest { assertThat(testUserState.equals(oldUserState), is(false)); oldUserState = new PackageUserStateImpl(); - oldUserState.putSuspendParams("suspendingPackage", + oldUserState.putSuspendParams(UserPackage.of(0, "suspendingPackage"), new SuspendParams(null, new PersistableBundle(), null)); assertThat(testUserState.equals(oldUserState), is(false)); @@ -220,6 +221,8 @@ public class PackageUserStateTest { final PersistableBundle launcherExtras2 = createPersistableBundle(null, 0, "name", "launcherExtras2", null, 0); + final int suspendingUser1 = 0; + final int suspendingUser2 = 10; final String suspendingPackage1 = "package1"; final String suspendingPackage2 = "package2"; @@ -230,12 +233,12 @@ public class PackageUserStateTest { .setMessage("dialogMessage2") .build(); - final ArrayMap<String, SuspendParams> paramsMap1 = new ArrayMap<>(); - paramsMap1.put(suspendingPackage1, createSuspendParams(dialogInfo1, appExtras1, - launcherExtras1)); - final ArrayMap<String, SuspendParams> paramsMap2 = new ArrayMap<>(); - paramsMap2.put(suspendingPackage2, createSuspendParams(dialogInfo2, - appExtras2, launcherExtras2)); + final ArrayMap<UserPackage, SuspendParams> paramsMap1 = new ArrayMap<>(); + paramsMap1.put(UserPackage.of(suspendingUser1, suspendingPackage1), + createSuspendParams(dialogInfo1, appExtras1, launcherExtras1)); + final ArrayMap<UserPackage, SuspendParams> paramsMap2 = new ArrayMap<>(); + paramsMap2.put(UserPackage.of(suspendingUser2, suspendingPackage2), + createSuspendParams(dialogInfo2, appExtras2, launcherExtras2)); final PackageUserStateImpl testUserState1 = new PackageUserStateImpl(); diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt index ae53e707a7cc5244289648aecb9594e6a121c59e..7444403f88c8712845934675684617cd498e1b99 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/SuspendPackageHelperTest.kt @@ -19,6 +19,7 @@ package com.android.server.pm import android.app.AppOpsManager import android.content.Intent import android.content.pm.SuspendDialogInfo +import android.content.pm.UserPackage import android.os.Binder import android.os.PersistableBundle import com.android.server.testutils.any @@ -41,12 +42,18 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { .thenReturn(AppOpsManager.MODE_DEFAULT) } + companion object { + val doUserPackage = UserPackage.of(TEST_USER_ID, DEVICE_OWNER_PACKAGE) + val platformUserPackage = UserPackage.of(TEST_USER_ID, PLATFORM_PACKAGE_NAME) + val testUserPackage1 = UserPackage.of(TEST_USER_ID, TEST_PACKAGE_1) + } + @Test fun setPackagesSuspended() { val targetPackages = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() @@ -63,14 +70,14 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { fun setPackagesSuspended_emptyPackageName() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), null /* packageNames */, true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).isNull() failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOfNulls(0), true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).isEmpty() @@ -80,7 +87,8 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { fun setPackagesSuspended_callerIsNotAllowed() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, TEST_PACKAGE_1, TEST_USER_ID, + null /* launcherExtras */, null /* dialogInfo */, + testUserPackage1, TEST_USER_ID, Binder.getCallingUid(), false /* quarantined */) assertThat(failedNames).asList().hasSize(1) @@ -91,7 +99,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { fun setPackagesSuspended_callerSuspendItself() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(DEVICE_OWNER_PACKAGE), true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).asList().hasSize(1) @@ -102,7 +110,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { fun setPackagesSuspended_nonexistentPackage() { val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(NONEXISTENT_PACKAGE), true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).asList().hasSize(1) @@ -115,7 +123,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { INSTALLER_PACKAGE, UNINSTALLER_PACKAGE, VERIFIER_PACKAGE, PERMISSION_CONTROLLER_PACKAGE) val failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), knownPackages, true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */)!! assertThat(failedNames.size).isEqualTo(knownPackages.size) @@ -129,14 +137,14 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { val targetPackages = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() Mockito.clearInvocations(broadcastHelper) assertThat(failedNames).isEmpty() failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, false /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() @@ -184,7 +192,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { appExtras.putString(TEST_PACKAGE_1, TEST_PACKAGE_1) var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_1), true /* suspended */, appExtras, null /* launcherExtras */, - null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, + null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() @@ -202,22 +210,22 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { val targetPackages = arrayOf(TEST_PACKAGE_1, TEST_PACKAGE_2) var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, appExtras, null /* launcherExtras */, - null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, + null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() Mockito.clearInvocations(broadcastHelper) assertThat(failedNames).isEmpty() assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) + TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isEqualTo(doUserPackage) assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) + TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(doUserPackage) assertThat(SuspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid)).isNotNull() assertThat(SuspendPackageHelper.getSuspendedPackageAppExtras(pms.snapshotComputer(), TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isNotNull() suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(), - targetPackages, { suspendingPackage -> suspendingPackage == DEVICE_OWNER_PACKAGE }, + targetPackages, { suspender -> suspender.packageName == DEVICE_OWNER_PACKAGE }, TEST_USER_ID) testHandler.flush() @@ -243,7 +251,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { launcherExtras.putString(TEST_PACKAGE_2, TEST_PACKAGE_2) var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, launcherExtras, - null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, + null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() @@ -258,7 +266,7 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { fun isPackageSuspended() { var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_1), true /* suspended */, null /* appExtras */, - null /* launcherExtras */, null /* dialogInfo */, DEVICE_OWNER_PACKAGE, + null /* launcherExtras */, null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() @@ -273,13 +281,13 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { launcherExtras.putString(TEST_PACKAGE_2, TEST_PACKAGE_2) var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_2), true /* suspended */, null /* appExtras */, launcherExtras, - null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, + null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) + TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(doUserPackage) } @Test @@ -290,57 +298,57 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { // Suspend. var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, null /* appExtras */, launcherExtras, - null /* dialogInfo */, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid, + null /* dialogInfo */, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).isEmpty() testHandler.flush() assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) + TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(doUserPackage) // Suspend by system. failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, null /* appExtras */, launcherExtras, - null /* dialogInfo */, PLATFORM_PACKAGE_NAME, TEST_USER_ID, deviceOwnerUid, + null /* dialogInfo */, platformUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) assertThat(failedNames).isEmpty() testHandler.flush() assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(PLATFORM_PACKAGE_NAME) + TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(platformUserPackage) // QAS by package1. failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), targetPackages, true /* suspended */, null /* appExtras */, launcherExtras, - null /* dialogInfo */, TEST_PACKAGE_1, TEST_USER_ID, deviceOwnerUid, + null /* dialogInfo */, testUserPackage1, TEST_USER_ID, deviceOwnerUid, true /* quarantined */) assertThat(failedNames).isEmpty() testHandler.flush() assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(TEST_PACKAGE_1) + TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(testUserPackage1) // Un-QAS by package1. suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(), - targetPackages, { suspendingPackage -> suspendingPackage == TEST_PACKAGE_1 }, + targetPackages, { suspendingPackage -> suspendingPackage == testUserPackage1 }, TEST_USER_ID) testHandler.flush() assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(PLATFORM_PACKAGE_NAME) + TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(platformUserPackage) // Un-suspend by system. suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(), - targetPackages, { suspendingPackage -> suspendingPackage == PLATFORM_PACKAGE_NAME }, + targetPackages, { suspender -> suspender.packageName == PLATFORM_PACKAGE_NAME }, TEST_USER_ID) testHandler.flush() assertThat(suspendPackageHelper.getSuspendingPackage(pms.snapshotComputer(), - TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(DEVICE_OWNER_PACKAGE) + TEST_PACKAGE_2, TEST_USER_ID, deviceOwnerUid)).isEqualTo(doUserPackage) // Unsuspend. suspendPackageHelper.removeSuspensionsBySuspendingPackage(pms.snapshotComputer(), - targetPackages, { suspendingPackage -> suspendingPackage == DEVICE_OWNER_PACKAGE }, + targetPackages, { suspendingPackage -> suspendingPackage == doUserPackage }, TEST_USER_ID) testHandler.flush() @@ -354,13 +362,13 @@ class SuspendPackageHelperTest : PackageHelperTestBase() { .setTitle(TEST_PACKAGE_1).build() var failedNames = suspendPackageHelper.setPackagesSuspended(pms.snapshotComputer(), arrayOf(TEST_PACKAGE_1), true /* suspended */, null /* appExtras */, - null /* launcherExtras */, dialogInfo, DEVICE_OWNER_PACKAGE, TEST_USER_ID, + null /* launcherExtras */, dialogInfo, doUserPackage, TEST_USER_ID, deviceOwnerUid, false /* quarantined */) testHandler.flush() assertThat(failedNames).isEmpty() val result = suspendPackageHelper.getSuspendedDialogInfo(pms.snapshotComputer(), - TEST_PACKAGE_1, DEVICE_OWNER_PACKAGE, TEST_USER_ID, deviceOwnerUid)!! + TEST_PACKAGE_1, doUserPackage, TEST_USER_ID, deviceOwnerUid)!! assertThat(result.title).isEqualTo(TEST_PACKAGE_1) } diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java index 943a9c4759c42cbfbb95baa5b0a474c1a8ae998a..1dd64ffa5ddedfa846d3e7a05c41057ea50d5551 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerServiceMigrationTest.java @@ -18,7 +18,6 @@ package com.android.server.devicepolicy; import static android.os.UserHandle.USER_SYSTEM; import static com.android.server.devicepolicy.DpmTestUtils.writeInputStreamToFile; -import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; @@ -222,21 +221,21 @@ public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase { prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.R); // Pretend some packages are suspended. - when(getServices().packageManagerInternal.isSuspendingAnyPackages( - PLATFORM_PACKAGE_NAME, USER_SYSTEM)).thenReturn(true); + when(getServices().packageManagerInternal.isAdminSuspendingAnyPackages( + USER_SYSTEM)).thenReturn(true); final DevicePolicyManagerServiceTestable dpms = bootDpmsUp(); verify(getServices().packageManagerInternal, never()) - .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, USER_SYSTEM); + .unsuspendAdminSuspendedPackages(USER_SYSTEM); sendBroadcastWithUser(dpms, Intent.ACTION_USER_STARTED, USER_SYSTEM); // Verify that actual package suspension state is not modified after user start verify(getServices().packageManagerInternal, never()) - .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, USER_SYSTEM); + .unsuspendAdminSuspendedPackages(USER_SYSTEM); verify(getServices().ipackageManager, never()).setPackagesSuspendedAsUser( - any(), anyBoolean(), any(), any(), any(), anyInt(), any(), anyInt()); + any(), anyBoolean(), any(), any(), any(), anyInt(), any(), anyInt(), anyInt()); final DpmMockContext poContext = new DpmMockContext(getServices(), mRealTestContext); poContext.binder.callingUid = UserHandle.getUid(COPE_PROFILE_USER_ID, COPE_ADMIN1_APP_ID); @@ -255,14 +254,14 @@ public class DevicePolicyManagerServiceMigrationTest extends DpmTestBase { prepareAdmin1AsPo(COPE_PROFILE_USER_ID, Build.VERSION_CODES.Q); // Pretend some packages are suspended. - when(getServices().packageManagerInternal.isSuspendingAnyPackages( - PLATFORM_PACKAGE_NAME, USER_SYSTEM)).thenReturn(true); + when(getServices().packageManagerInternal.isAdminSuspendingAnyPackages( + USER_SYSTEM)).thenReturn(true); final DevicePolicyManagerServiceTestable dpms = bootDpmsUp(); // Verify that apps get unsuspended. verify(getServices().packageManagerInternal) - .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, USER_SYSTEM); + .unsuspendAdminSuspendedPackages(USER_SYSTEM); final DpmMockContext poContext = new DpmMockContext(getServices(), mRealTestContext); poContext.binder.callingUid = UserHandle.getUid(COPE_PROFILE_USER_ID, COPE_ADMIN1_APP_ID); diff --git a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java index f4dac2c10d0fc999cbf5648d8e433e99b8180b01..24704034ae0c6437e93fd7ba0055a454d0b81209 100644 --- a/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicepolicy/DevicePolicyManagerTest.java @@ -63,7 +63,6 @@ import static com.android.server.SystemTimeZone.TIME_ZONE_CONFIDENCE_HIGH; import static com.android.server.devicepolicy.DevicePolicyManagerService.ACTION_PROFILE_OFF_DEADLINE; import static com.android.server.devicepolicy.DevicePolicyManagerService.ACTION_TURN_PROFILE_ON_NOTIFICATION; import static com.android.server.devicepolicy.DpmMockContext.CALLER_USER_HANDLE; -import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import static com.android.server.testutils.TestUtils.assertExpectException; import static com.google.common.truth.Truth.assertThat; @@ -5080,7 +5079,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { verify(getServices().iwindowManager).refreshScreenCaptureDisabled(); // Unsuspend personal apps verify(getServices().packageManagerInternal) - .unsuspendForSuspendingPackage(PLATFORM_PACKAGE_NAME, UserHandle.USER_SYSTEM); + .unsuspendAdminSuspendedPackages(UserHandle.USER_SYSTEM); verify(getServices().subscriptionManager).setSubscriptionUserHandle(0, null); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_DEVICE_POLICY_MANAGER, FLAG_ENABLE_WORK_PROFILE_TELEPHONY, "false", false); @@ -7535,7 +7534,7 @@ public class DevicePolicyManagerTest extends DpmTestBase { .cancel(eq(SystemMessageProto.SystemMessage.NOTE_PERSONAL_APPS_SUSPENDED)); // Verify that the apps are NOT unsuspeded. verify(getServices().ipackageManager, never()).setPackagesSuspendedAsUser( - any(), eq(false), any(), any(), any(), anyInt(), any(), anyInt()); + any(), eq(false), any(), any(), any(), anyInt(), any(), anyInt(), anyInt()); // Verify that DPC is invoked to check policy compliance. verify(mContext.spiedContext).startActivityAsUser( MockUtils.checkIntentAction(ACTION_CHECK_POLICY_COMPLIANCE), diff --git a/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java b/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java index 526201f9c1c6528084698591d3db5f55c5677151..670f9f697a5cef00cd966ea5114c8e73218a289c 100644 --- a/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/ActivityStartInterceptorTest.java @@ -49,6 +49,7 @@ import android.content.pm.IPackageManager; import android.content.pm.PackageManagerInternal; import android.content.pm.SuspendDialogInfo; import android.content.pm.UserInfo; +import android.content.pm.UserPackage; import android.os.RemoteException; import android.os.UserHandle; import android.os.UserManager; @@ -195,7 +196,7 @@ public class ActivityStartInterceptorTest { mAInfo.applicationInfo.flags = FLAG_SUSPENDED; when(mPackageManagerInternal.getSuspendingPackage(TEST_PACKAGE_NAME, TEST_USER_ID)) - .thenReturn(PLATFORM_PACKAGE_NAME); + .thenReturn(UserPackage.of(TEST_USER_ID, PLATFORM_PACKAGE_NAME)); // THEN calling intercept returns true assertTrue(mInterceptor.intercept(null, null, mAInfo, null, null, null, 0, 0, null, null)); @@ -227,9 +228,10 @@ public class ActivityStartInterceptorTest { .setMessage("Test Message") .setIcon(0x11110001) .build(); + UserPackage suspender = UserPackage.of(TEST_USER_ID, suspendingPackage); when(mPackageManagerInternal.getSuspendingPackage(TEST_PACKAGE_NAME, TEST_USER_ID)) - .thenReturn(suspendingPackage); - when(mPackageManagerInternal.getSuspendedDialogInfo(TEST_PACKAGE_NAME, suspendingPackage, + .thenReturn(suspender); + when(mPackageManagerInternal.getSuspendedDialogInfo(TEST_PACKAGE_NAME, suspender, TEST_USER_ID)).thenReturn(dialogInfo); return dialogInfo; }