From 8bb9d293d6481294eb2c6149f4cba627a6b61fe5 Mon Sep 17 00:00:00 2001 From: Lee Shombert Date: Thu, 22 Jul 2021 11:58:26 -0700 Subject: [PATCH] PackageSetting now owns its PackageUserState Bug: 194349419 The PackageSetting snapshot now clones the PackageUserState rather than simply copying the reference. Test: atest * CtsContentTestCases:IntentFilterTest * CtsDynamicMimeHostTestCases * CtsRoleTestCases * FrameworksServicesTests:UserSystemPackageInstallerTest * FrameworksServicesTests:PackageManagerSettingsTests * FrameworksServicesTests:PackageManagerServiceTest * FrameworksServicesTests:AppsFilterTest * FrameworksServicesTests:PackageInstallerSessionTest * FrameworksServicesTests:ScanTests * UserLifecycleTests#startUser * UserLifecycleTests#stopUser * UserLifecycleTests#switchUser * FrameworksServicesTests:WatcherTest * android.appsecurity.cts.EphemeralTest * android.appsecurity.cts.InstantAppUserTest Change-Id: I27d26e0a34e445bf2e67139199d8ec7fb1b73583 --- .../android/server/pm/PackageSettingBase.java | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageSettingBase.java b/services/core/java/com/android/server/pm/PackageSettingBase.java index bf82bd8b09d54..88dd03333262e 100644 --- a/services/core/java/com/android/server/pm/PackageSettingBase.java +++ b/services/core/java/com/android/server/pm/PackageSettingBase.java @@ -176,6 +176,10 @@ public abstract class PackageSettingBase extends SettingBase { name = orig.name; realName = orig.realName; doCopy(orig); + // Clone the user states. + for (int i = 0; i < mUserState.size(); i++) { + mUserState.put(mUserState.keyAt(i), new PackageUserState(mUserState.valueAt(i))); + } } public void setInstallerPackageName(String packageName) { @@ -314,6 +318,7 @@ public abstract class PackageSettingBase extends SettingBase { void setInstalled(boolean inst, int userId) { modifyUserState(userId).installed = inst; + onChanged(); } boolean getInstalled(int userId) { @@ -326,6 +331,7 @@ public abstract class PackageSettingBase extends SettingBase { void setInstallReason(int installReason, int userId) { modifyUserState(userId).installReason = installReason; + onChanged(); } int getUninstallReason(int userId) { @@ -334,10 +340,13 @@ public abstract class PackageSettingBase extends SettingBase { void setUninstallReason(@UninstallReason int uninstallReason, int userId) { modifyUserState(userId).uninstallReason = uninstallReason; + onChanged(); } boolean setOverlayPaths(OverlayPaths overlayPaths, int userId) { - return modifyUserState(userId).setOverlayPaths(overlayPaths); + boolean returnValue = modifyUserState(userId).setOverlayPaths(overlayPaths); + onChanged(); + return returnValue; } OverlayPaths getOverlayPaths(int userId) { @@ -346,7 +355,10 @@ public abstract class PackageSettingBase extends SettingBase { boolean setOverlayPathsForLibrary(String libName, OverlayPaths overlayPaths, int userId) { - return modifyUserState(userId).setSharedLibraryOverlayPaths(libName, overlayPaths); + boolean returnValue = modifyUserState(userId) + .setSharedLibraryOverlayPaths(libName, overlayPaths); + onChanged(); + return returnValue; } Map getOverlayPathsForLibrary(int userId) { @@ -395,6 +407,7 @@ public abstract class PackageSettingBase extends SettingBase { void setCeDataInode(long ceDataInode, int userId) { modifyUserState(userId).ceDataInode = ceDataInode; + onChanged(); } boolean getStopped(int userId) { @@ -403,6 +416,7 @@ public abstract class PackageSettingBase extends SettingBase { void setStopped(boolean stop, int userId) { modifyUserState(userId).stopped = stop; + onChanged(); } boolean getNotLaunched(int userId) { @@ -411,6 +425,7 @@ public abstract class PackageSettingBase extends SettingBase { void setNotLaunched(boolean stop, int userId) { modifyUserState(userId).notLaunched = stop; + onChanged(); } boolean getHidden(int userId) { @@ -419,6 +434,7 @@ public abstract class PackageSettingBase extends SettingBase { void setHidden(boolean hidden, int userId) { modifyUserState(userId).hidden = hidden; + onChanged(); } int getDistractionFlags(int userId) { @@ -427,6 +443,7 @@ public abstract class PackageSettingBase extends SettingBase { void setDistractionFlags(int distractionFlags, int userId) { modifyUserState(userId).distractionFlags = distractionFlags; + onChanged(); } boolean getSuspended(int userId) { @@ -487,6 +504,7 @@ public abstract class PackageSettingBase extends SettingBase { void setInstantApp(boolean instantApp, int userId) { modifyUserState(userId).instantApp = instantApp; + onChanged(); } boolean getVirtulalPreload(int userId) { @@ -495,6 +513,7 @@ public abstract class PackageSettingBase extends SettingBase { void setVirtualPreload(boolean virtualPreload, int userId) { modifyUserState(userId).virtualPreload = virtualPreload; + onChanged(); } void setUserState(int userId, long ceDataInode, int enabled, boolean installed, boolean stopped, @@ -547,20 +566,24 @@ public abstract class PackageSettingBase extends SettingBase { void setEnabledComponents(ArraySet components, int userId) { modifyUserState(userId).enabledComponents = components; + onChanged(); } void setDisabledComponents(ArraySet components, int userId) { modifyUserState(userId).disabledComponents = components; + onChanged(); } void setEnabledComponentsCopy(ArraySet components, int userId) { modifyUserState(userId).enabledComponents = components != null ? new ArraySet(components) : null; + onChanged(); } void setDisabledComponentsCopy(ArraySet components, int userId) { modifyUserState(userId).disabledComponents = components != null ? new ArraySet(components) : null; + onChanged(); } PackageUserState modifyUserStateComponents(int userId, boolean disabled, boolean enabled) { @@ -582,10 +605,12 @@ public abstract class PackageSettingBase extends SettingBase { void addDisabledComponent(String componentClassName, int userId) { modifyUserStateComponents(userId, true, false).disabledComponents.add(componentClassName); + onChanged(); } void addEnabledComponent(String componentClassName, int userId) { modifyUserStateComponents(userId, false, true).enabledComponents.add(componentClassName); + onChanged(); } boolean enableComponentLPw(String componentClassName, int userId) { @@ -593,6 +618,9 @@ public abstract class PackageSettingBase extends SettingBase { boolean changed = state.disabledComponents != null ? state.disabledComponents.remove(componentClassName) : false; changed |= state.enabledComponents.add(componentClassName); + if (changed) { + onChanged(); + } return changed; } @@ -601,6 +629,9 @@ public abstract class PackageSettingBase extends SettingBase { boolean changed = state.enabledComponents != null ? state.enabledComponents.remove(componentClassName) : false; changed |= state.disabledComponents.add(componentClassName); + if (changed) { + onChanged(); + } return changed; } @@ -610,6 +641,9 @@ public abstract class PackageSettingBase extends SettingBase { ? state.disabledComponents.remove(componentClassName) : false; changed |= state.enabledComponents != null ? state.enabledComponents.remove(componentClassName) : false; + if (changed) { + onChanged(); + } return changed; } @@ -701,6 +735,7 @@ public abstract class PackageSettingBase extends SettingBase { PackageSettingBase setPath(@NonNull File path) { this.mPath = path; this.mPathString = path.toString(); + onChanged(); return this; } @@ -722,7 +757,9 @@ public abstract class PackageSettingBase extends SettingBase { @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE) public boolean overrideNonLocalizedLabelAndIcon(@NonNull ComponentName component, @Nullable String label, @Nullable Integer icon, @UserIdInt int userId) { - return modifyUserState(userId).overrideLabelAndIcon(component, label, icon); + boolean returnValue = modifyUserState(userId).overrideLabelAndIcon(component, label, icon); + onChanged(); + return returnValue; } /** @@ -732,6 +769,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void resetOverrideComponentLabelIcon(@UserIdInt int userId) { modifyUserState(userId).resetOverrideComponentLabelIcon(); + onChanged(); } /** @@ -741,6 +779,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setSplashScreenTheme(@UserIdInt int userId, @Nullable String themeName) { modifyUserState(userId).splashScreenTheme = themeName; + onChanged(); } /** @@ -776,6 +815,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setStatesOnCommit() { incrementalStates.onCommit(IncrementalManager.isIncrementalPath(getPathString())); + onChanged(); } /** @@ -783,6 +823,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setIncrementalStatesCallback(IncrementalStates.Callback callback) { incrementalStates.setCallback(callback); + onChanged(); } /** @@ -791,6 +832,7 @@ public abstract class PackageSettingBase extends SettingBase { */ public void setLoadingProgress(float progress) { incrementalStates.setProgress(progress); + onChanged(); } public long getFirstInstallTime() {