diff options
| author | 2022-02-14 00:42:46 +0000 | |
|---|---|---|
| committer | 2022-02-14 00:42:46 +0000 | |
| commit | 64806e51f798693b81688d4a534a2ae394cf91db (patch) | |
| tree | da54c6b508b56913b77dbd091eb37f250f1252d4 | |
| parent | ef75d4bd838c28b06da1be5215646b478cd2c4b9 (diff) | |
| parent | 0a7550ba5542f569e328bae93ff2b931cd65160e (diff) | |
Merge "[pm] use snapshot instead of deep-copy of PackageUserState"
11 files changed, 336 insertions, 166 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 6709bf10d882..5c68fac7715e 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -7558,7 +7558,7 @@ public class PackageManagerService extends IPackageManager.Stub if (packageState == null) { return new ArraySet<>(); } - return packageState.getUserStateOrDefault(userId).getEnabledComponentsNoCopy(); + return packageState.getUserStateOrDefault(userId).getEnabledComponents(); } @Override @@ -7567,7 +7567,7 @@ public class PackageManagerService extends IPackageManager.Stub if (packageState == null) { return new ArraySet<>(); } - return packageState.getUserStateOrDefault(userId).getDisabledComponentsNoCopy(); + return packageState.getUserStateOrDefault(userId).getDisabledComponents(); } @Override diff --git a/services/core/java/com/android/server/pm/PackageSetting.java b/services/core/java/com/android/server/pm/PackageSetting.java index 6efc55a46a49..f06ae1e06187 100644 --- a/services/core/java/com/android/server/pm/PackageSetting.java +++ b/services/core/java/com/android/server/pm/PackageSetting.java @@ -52,6 +52,7 @@ import com.android.server.pm.pkg.PackageUserStateImpl; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.SuspendParams; import com.android.server.utils.SnapshotCache; +import com.android.server.utils.WatchedArraySet; import libcore.util.EmptyArray; @@ -249,7 +250,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal PackageSetting(@NonNull PackageSetting original, boolean sealedSnapshot) { super(original); - copyPackageSetting(original); + copyPackageSetting(original, sealedSnapshot); if (sealedSnapshot) { mSnapshot = new SnapshotCache.Sealed(); } else { @@ -515,7 +516,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal /** Updates all fields in the current setting from another. */ public void updateFrom(PackageSetting other) { - copyPackageSetting(other); + copyPackageSetting(other, false /* sealedSnapshot */); Set<String> mimeGroupNames = other.mimeGroups != null ? other.mimeGroups.keySet() : null; updateMimeGroups(mimeGroupNames); @@ -608,7 +609,7 @@ public class PackageSetting extends SettingBase implements PackageStateInternal return this; } - public void copyPackageSetting(PackageSetting other) { + public void copyPackageSetting(PackageSetting other, boolean sealedSnapshot) { super.copySettingBase(other); mSharedUserAppId = other.mSharedUserAppId; mLoadingProgress = other.mLoadingProgress; @@ -650,8 +651,12 @@ public class PackageSetting extends SettingBase implements PackageStateInternal other.usesStaticLibrariesVersions.length) : null; mUserStates.clear(); for (int i = 0; i < other.mUserStates.size(); i++) { - mUserStates.put(other.mUserStates.keyAt(i), - new PackageUserStateImpl(this, other.mUserStates.valueAt(i))); + if (sealedSnapshot) { + mUserStates.put(other.mUserStates.keyAt(i), + other.mUserStates.valueAt(i).snapshot()); + } else { + mUserStates.put(other.mUserStates.keyAt(i), other.mUserStates.valueAt(i)); + } } if (mOldCodePaths != null) { @@ -871,42 +876,48 @@ public class PackageSetting extends SettingBase implements PackageStateInternal setUserState(userId, otherState.getCeDataInode(), otherState.getEnabledState(), otherState.isInstalled(), otherState.isStopped(), otherState.isNotLaunched(), otherState.isHidden(), otherState.getDistractionFlags(), - otherState.getSuspendParams(), otherState.isInstantApp(), + otherState.getSuspendParams() == null + ? null : otherState.getSuspendParams().untrackedStorage(), + otherState.isInstantApp(), otherState.isVirtualPreload(), otherState.getLastDisableAppCaller(), - new ArraySet<>(otherState.getEnabledComponentsNoCopy()), - new ArraySet<>(otherState.getDisabledComponentsNoCopy()), + otherState.getEnabledComponentsNoCopy() == null + ? null : otherState.getEnabledComponentsNoCopy().untrackedStorage(), + otherState.getDisabledComponentsNoCopy() == null + ? null : otherState.getDisabledComponentsNoCopy().untrackedStorage(), otherState.getInstallReason(), otherState.getUninstallReason(), otherState.getHarmfulAppWarning(), otherState.getSplashScreenTheme(), otherState.getFirstInstallTime()); } - ArraySet<String> getEnabledComponents(int userId) { + WatchedArraySet<String> getEnabledComponents(int userId) { return readUserState(userId).getEnabledComponentsNoCopy(); } - ArraySet<String> getDisabledComponents(int userId) { + WatchedArraySet<String> getDisabledComponents(int userId) { return readUserState(userId).getDisabledComponentsNoCopy(); } - void setEnabledComponents(ArraySet<String> components, int userId) { + /** Test only */ + void setEnabledComponents(WatchedArraySet<String> components, int userId) { modifyUserState(userId).setEnabledComponents(components); onChanged(); } - void setDisabledComponents(ArraySet<String> components, int userId) { + /** Test only */ + void setDisabledComponents(WatchedArraySet<String> components, int userId) { modifyUserState(userId).setDisabledComponents(components); onChanged(); } - void setEnabledComponentsCopy(ArraySet<String> components, int userId) { + void setEnabledComponentsCopy(WatchedArraySet<String> components, int userId) { modifyUserState(userId).setEnabledComponents(components != null - ? new ArraySet<String>(components) : null); + ? components.untrackedStorage() : null); onChanged(); } - void setDisabledComponentsCopy(ArraySet<String> components, int userId) { + void setDisabledComponentsCopy(WatchedArraySet<String> components, int userId) { modifyUserState(userId).setDisabledComponents(components != null - ? new ArraySet<String>(components) : null); + ? components.untrackedStorage() : null); onChanged(); } diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 53d0a7397bcb..5966917c680a 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -2142,20 +2142,24 @@ public final class Settings implements Watchable, Snappable { serializer.endTag(null, TAG_SUSPEND_PARAMS); } } - if (!ArrayUtils.isEmpty(ustate.getEnabledComponentsNoCopy())) { + final ArraySet<String> enabledComponents = ustate.getEnabledComponents(); + if (enabledComponents != null && enabledComponents.size() > 0) { serializer.startTag(null, TAG_ENABLED_COMPONENTS); - for (final String name : ustate.getEnabledComponentsNoCopy()) { + for (int i = 0; i < enabledComponents.size(); i++) { serializer.startTag(null, TAG_ITEM); - serializer.attribute(null, ATTR_NAME, name); + serializer.attribute(null, ATTR_NAME, + enabledComponents.valueAt(i)); serializer.endTag(null, TAG_ITEM); } serializer.endTag(null, TAG_ENABLED_COMPONENTS); } - if (!ArrayUtils.isEmpty(ustate.getDisabledComponentsNoCopy())) { + final ArraySet<String> disabledComponents = ustate.getDisabledComponents(); + if (disabledComponents != null && disabledComponents.size() > 0) { serializer.startTag(null, TAG_DISABLED_COMPONENTS); - for (final String name : ustate.getDisabledComponentsNoCopy()) { + for (int i = 0; i < disabledComponents.size(); i++) { serializer.startTag(null, TAG_ITEM); - serializer.attribute(null, ATTR_NAME, name); + serializer.attribute(null, ATTR_NAME, + disabledComponents.valueAt(i)); serializer.endTag(null, TAG_ITEM); } serializer.endTag(null, TAG_DISABLED_COMPONENTS); @@ -4987,18 +4991,18 @@ public final class Settings implements Watchable, Snappable { } if (permissionNames == null) { - Set<String> cmp = userState.getDisabledComponents(); + WatchedArraySet<String> cmp = userState.getDisabledComponentsNoCopy(); if (cmp != null && cmp.size() > 0) { pw.print(prefix); pw.println(" disabledComponents:"); - for (String s : cmp) { - pw.print(prefix); pw.print(" "); pw.println(s); + for (int i = 0; i < cmp.size(); i++) { + pw.print(prefix); pw.print(" "); pw.println(cmp.valueAt(i)); } } - cmp = userState.getEnabledComponents(); + cmp = userState.getEnabledComponentsNoCopy(); if (cmp != null && cmp.size() > 0) { pw.print(prefix); pw.println(" enabledComponents:"); - for (String s : cmp) { - pw.print(prefix); pw.print(" "); pw.println(s); + for (int i = 0; i < cmp.size(); i++) { + pw.print(prefix); pw.print(" "); pw.println(cmp.valueAt(i)); } } } diff --git a/services/core/java/com/android/server/pm/SuspendPackageHelper.java b/services/core/java/com/android/server/pm/SuspendPackageHelper.java index 1ea8b2478a90..85d1367d340b 100644 --- a/services/core/java/com/android/server/pm/SuspendPackageHelper.java +++ b/services/core/java/com/android/server/pm/SuspendPackageHelper.java @@ -52,6 +52,7 @@ import com.android.server.pm.pkg.PackageStateInternal; import com.android.server.pm.pkg.PackageUserStateInternal; import com.android.server.pm.pkg.SuspendParams; import com.android.server.pm.pkg.mutate.PackageUserStateWrite; +import com.android.server.utils.WatchedArrayMap; import java.util.ArrayList; import java.util.Arrays; @@ -145,7 +146,7 @@ public final class SuspendPackageHelper { continue; } - final ArrayMap<String, SuspendParams> suspendParamsMap = + final WatchedArrayMap<String, SuspendParams> suspendParamsMap = packageState.getUserStateOrDefault(userId).getSuspendParams(); final SuspendParams suspendParams = suspendParamsMap == null ? null : suspendParamsMap.get(packageName); @@ -297,7 +298,8 @@ public final class SuspendPackageHelper { continue; } - ArrayMap<String, SuspendParams> suspendParamsMap = packageUserState.getSuspendParams(); + WatchedArrayMap<String, SuspendParams> suspendParamsMap = + packageUserState.getSuspendParams(); int countRemoved = 0; for (int index = 0; index < suspendParamsMap.size(); index++) { String suspendingPackage = suspendParamsMap.keyAt(index); @@ -440,7 +442,8 @@ public final class SuspendPackageHelper { return null; } - final ArrayMap<String, SuspendParams> suspendParamsMap = userState.getSuspendParams(); + final WatchedArrayMap<String, SuspendParams> suspendParamsMap = + userState.getSuspendParams(); if (suspendParamsMap == null) { return null; } diff --git a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java b/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java index 9a21e24030a8..3170304985b5 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java +++ b/services/core/java/com/android/server/pm/pkg/PackageStateImpl.java @@ -24,6 +24,7 @@ import android.content.pm.PackageManagerInternal; import android.content.pm.SharedLibraryInfo; import android.content.pm.SigningInfo; import android.content.pm.overlay.OverlayPaths; +import android.util.ArraySet; import android.util.SparseArray; import com.android.internal.util.DataClass; @@ -329,11 +330,11 @@ public class PackageStateImpl implements PackageState { private final long mCeDataInode; @NonNull - private final Set<String> mDisabledComponents; + private final ArraySet<String> mDisabledComponents; @PackageManager.DistractionRestriction private final int mDistractionFlags; @NonNull - private final Set<String> mEnabledComponents; + private final ArraySet<String> mEnabledComponents; private final int mEnabledState; @Nullable private final String mHarmfulAppWarning; @@ -460,7 +461,8 @@ public class PackageStateImpl implements PackageState { } @DataClass.Generated.Member - public @NonNull Set<String> getDisabledComponents() { + public @NonNull + ArraySet<String> getDisabledComponents() { return mDisabledComponents; } @@ -470,7 +472,7 @@ public class PackageStateImpl implements PackageState { } @DataClass.Generated.Member - public @NonNull Set<String> getEnabledComponents() { + public @NonNull ArraySet<String> getEnabledComponents() { return mEnabledComponents; } diff --git a/services/core/java/com/android/server/pm/pkg/PackageUserState.java b/services/core/java/com/android/server/pm/pkg/PackageUserState.java index bed140192fda..e19e555b5fcf 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserState.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserState.java @@ -18,14 +18,12 @@ package com.android.server.pm.pkg; import android.annotation.NonNull; import android.annotation.Nullable; -import android.annotation.SuppressLint; -import android.annotation.SystemApi; import android.content.pm.PackageManager; import android.content.pm.overlay.OverlayPaths; import android.os.UserHandle; +import android.util.ArraySet; import java.util.Map; -import java.util.Set; /** * The API surface for {@link PackageUserStateInternal}, for use by in-process mainline consumers. @@ -59,7 +57,7 @@ public interface PackageUserState { * Fully qualified class names of components explicitly disabled. */ @NonNull - Set<String> getDisabledComponents(); + ArraySet<String> getDisabledComponents(); @PackageManager.DistractionRestriction int getDistractionFlags(); @@ -68,7 +66,7 @@ public interface PackageUserState { * Fully qualified class names of components explicitly enabled. */ @NonNull - Set<String> getEnabledComponents(); + ArraySet<String> getEnabledComponents(); /** * Retrieve the effective enabled state of the package itself. 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 73c86c7f163d..daa4545b4a4a 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java @@ -21,13 +21,14 @@ import android.annotation.Nullable; import android.content.ComponentName; import android.content.pm.PackageManager; import android.content.pm.overlay.OverlayPaths; -import android.util.ArrayMap; import android.util.ArraySet; import android.util.Pair; +import com.android.server.utils.WatchedArrayMap; +import com.android.server.utils.WatchedArraySet; + import java.util.Collections; import java.util.Map; -import java.util.Set; class PackageUserStateDefault implements PackageUserStateInternal { @@ -59,14 +60,14 @@ class PackageUserStateDefault implements PackageUserStateInternal { @NonNull @Override - public Set<String> getDisabledComponents() { - return Collections.emptySet(); + public ArraySet<String> getDisabledComponents() { + return new ArraySet<>(); } @NonNull @Override - public Set<String> getEnabledComponents() { - return Collections.emptySet(); + public ArraySet<String> getEnabledComponents() { + return new ArraySet<>(); } @Override @@ -156,19 +157,19 @@ class PackageUserStateDefault implements PackageUserStateInternal { @Nullable @Override - public ArrayMap<String, SuspendParams> getSuspendParams() { + public WatchedArrayMap<String, SuspendParams> getSuspendParams() { return null; } @Nullable @Override - public ArraySet<String> getDisabledComponentsNoCopy() { + public WatchedArraySet<String> getDisabledComponentsNoCopy() { return null; } @Nullable @Override - public ArraySet<String> getEnabledComponentsNoCopy() { + public WatchedArraySet<String> getEnabledComponentsNoCopy() { 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 efb6144af9a8..410fa975cb8a 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java @@ -30,19 +30,25 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; import com.android.internal.util.CollectionUtils; import com.android.internal.util.DataClass; +import com.android.server.utils.Snappable; +import com.android.server.utils.SnapshotCache; import com.android.server.utils.Watchable; +import com.android.server.utils.WatchableImpl; +import com.android.server.utils.WatchedArrayMap; +import com.android.server.utils.WatchedArraySet; import java.util.Objects; @DataClass(genConstructor = false, genBuilder = false, genEqualsHashCode = true) @DataClass.Suppress({"mOverlayPathsLock", "mOverlayPaths", "mSharedLibraryOverlayPathsLock", "mSharedLibraryOverlayPaths", "setOverlayPaths", "setCachedOverlayPaths"}) -public class PackageUserStateImpl implements PackageUserStateInternal { +public class PackageUserStateImpl extends WatchableImpl implements PackageUserStateInternal, + Snappable { @Nullable - protected ArraySet<String> mDisabledComponents; + protected WatchedArraySet<String> mDisabledComponentsWatched; @Nullable - protected ArraySet<String> mEnabledComponents; + protected WatchedArraySet<String> mEnabledComponentsWatched; private long mCeDataInode; private boolean mInstalled = true; @@ -63,11 +69,11 @@ public class PackageUserStateImpl implements PackageUserStateInternal { private String mLastDisableAppCaller; @Nullable - protected OverlayPaths mOverlayPaths; + private OverlayPaths mOverlayPaths; // Lib name to overlay paths @Nullable - protected ArrayMap<String, OverlayPaths> mSharedLibraryOverlayPaths; + protected WatchedArrayMap<String, OverlayPaths> mSharedLibraryOverlayPaths; @Nullable private String mSplashScreenTheme; @@ -76,33 +82,50 @@ public class PackageUserStateImpl implements PackageUserStateInternal { * Suspending package to suspend params */ @Nullable - private ArrayMap<String, SuspendParams> mSuspendParams; + private WatchedArrayMap<String, SuspendParams> mSuspendParams; @Nullable - private ArrayMap<ComponentName, Pair<String, Integer>> mComponentLabelIconOverrideMap; + private WatchedArrayMap<ComponentName, Pair<String, Integer>> mComponentLabelIconOverrideMap; private long mFirstInstallTime; @Nullable private final Watchable mWatchable; + @NonNull + final SnapshotCache<PackageUserStateImpl> mSnapshot; + + private SnapshotCache<PackageUserStateImpl> makeCache() { + return new SnapshotCache<PackageUserStateImpl>(this, this) { + @Override + public PackageUserStateImpl createSnapshot() { + return new PackageUserStateImpl(mWatchable, mSource); + }}; + } + + /** + * Only used for tests + */ public PackageUserStateImpl() { super(); mWatchable = null; + mSnapshot = makeCache(); } public PackageUserStateImpl(@NonNull Watchable watchable) { mWatchable = watchable; + mSnapshot = makeCache(); } public PackageUserStateImpl(@NonNull Watchable watchable, PackageUserStateImpl other) { mWatchable = watchable; - mDisabledComponents = ArrayUtils.cloneOrNull(other.mDisabledComponents); - mEnabledComponents = ArrayUtils.cloneOrNull(other.mEnabledComponents); + mDisabledComponentsWatched = other.mDisabledComponentsWatched == null + ? null : other.mDisabledComponentsWatched.snapshot(); + mEnabledComponentsWatched = other.mEnabledComponentsWatched == null + ? null : other.mEnabledComponentsWatched.snapshot(); mOverlayPaths = other.mOverlayPaths; - if (other.mSharedLibraryOverlayPaths != null) { - mSharedLibraryOverlayPaths = new ArrayMap<>(other.mSharedLibraryOverlayPaths); - } + mSharedLibraryOverlayPaths = other.mSharedLibraryOverlayPaths == null + ? null : other.mSharedLibraryOverlayPaths.snapshot(); mCeDataInode = other.mCeDataInode; mInstalled = other.mInstalled; mStopped = other.mStopped; @@ -117,16 +140,24 @@ public class PackageUserStateImpl implements PackageUserStateInternal { mHarmfulAppWarning = other.mHarmfulAppWarning; mLastDisableAppCaller = other.mLastDisableAppCaller; mSplashScreenTheme = other.mSplashScreenTheme; - mSuspendParams = other.mSuspendParams == null ? null : new ArrayMap<>(other.mSuspendParams); - mComponentLabelIconOverrideMap = other.mComponentLabelIconOverrideMap == null ? null - : new ArrayMap<>(other.mComponentLabelIconOverrideMap); + mSuspendParams = other.mSuspendParams == null ? null : other.mSuspendParams.snapshot(); + mComponentLabelIconOverrideMap = other.mComponentLabelIconOverrideMap == null + ? null : other.mComponentLabelIconOverrideMap.snapshot(); mFirstInstallTime = other.mFirstInstallTime; + mSnapshot = new SnapshotCache.Sealed<>(); } private void onChanged() { if (mWatchable != null) { mWatchable.dispatchChange(mWatchable); } + dispatchChange(this); + } + + @NonNull + @Override + public PackageUserStateImpl snapshot() { + return mSnapshot.snapshot(); } /** @@ -156,7 +187,8 @@ public class PackageUserStateImpl implements PackageUserStateInternal { public boolean setSharedLibraryOverlayPaths(@NonNull String library, @Nullable OverlayPaths paths) { if (mSharedLibraryOverlayPaths == null) { - mSharedLibraryOverlayPaths = new ArrayMap<>(); + mSharedLibraryOverlayPaths = new WatchedArrayMap<>(); + mSharedLibraryOverlayPaths.registerObserver(mSnapshot); } final OverlayPaths currentPaths = mSharedLibraryOverlayPaths.get(library); if (Objects.equals(paths, currentPaths)) { @@ -175,26 +207,41 @@ public class PackageUserStateImpl implements PackageUserStateInternal { @Nullable @Override - public ArraySet<String> getDisabledComponentsNoCopy() { - return mDisabledComponents; + public WatchedArraySet<String> getDisabledComponentsNoCopy() { + return mDisabledComponentsWatched; } @Nullable @Override - public ArraySet<String> getEnabledComponentsNoCopy() { - return mEnabledComponents; + public WatchedArraySet<String> getEnabledComponentsNoCopy() { + return mEnabledComponentsWatched; + } + + @NonNull + @Override + public ArraySet<String> getDisabledComponents() { + return mDisabledComponentsWatched == null + ? new ArraySet<>() : mDisabledComponentsWatched.untrackedStorage(); } + @NonNull + @Override + public ArraySet<String> getEnabledComponents() { + return mEnabledComponentsWatched == null + ? new ArraySet<>() : mEnabledComponentsWatched.untrackedStorage(); + } + + @Override public boolean isComponentEnabled(String componentName) { - // TODO: Not locked - return ArrayUtils.contains(mEnabledComponents, componentName); + return mEnabledComponentsWatched != null + && mEnabledComponentsWatched.contains(componentName); } @Override public boolean isComponentDisabled(String componentName) { - // TODO: Not locked - return ArrayUtils.contains(mDisabledComponents, componentName); + return mDisabledComponentsWatched != null + && mDisabledComponentsWatched.contains(componentName); } @Override @@ -242,7 +289,8 @@ public class PackageUserStateImpl implements PackageUserStateInternal { } } else { if (mComponentLabelIconOverrideMap == null) { - mComponentLabelIconOverrideMap = new ArrayMap<>(1); + mComponentLabelIconOverrideMap = new WatchedArrayMap<>(1); + mComponentLabelIconOverrideMap.registerObserver(mSnapshot); } mComponentLabelIconOverrideMap.put(component, Pair.create(nonLocalizedLabel, icon)); @@ -281,7 +329,8 @@ public class PackageUserStateImpl implements PackageUserStateInternal { public PackageUserStateImpl putSuspendParams(@NonNull String suspendingPackage, @Nullable SuspendParams suspendParams) { if (mSuspendParams == null) { - mSuspendParams = new ArrayMap<>(); + mSuspendParams = new WatchedArrayMap<>(); + mSuspendParams.registerObserver(mSnapshot); } if (!mSuspendParams.containsKey(suspendingPackage) || !Objects.equals(mSuspendParams.get(suspendingPackage), suspendParams)) { @@ -300,14 +349,50 @@ public class PackageUserStateImpl implements PackageUserStateInternal { return this; } - public @NonNull PackageUserStateImpl setDisabledComponents(@NonNull ArraySet<String> value) { - mDisabledComponents = value; + public @NonNull PackageUserStateImpl setDisabledComponents(@Nullable ArraySet<String> value) { + if (value == null) { + return this; + } + if (mDisabledComponentsWatched == null) { + mDisabledComponentsWatched = new WatchedArraySet<>(); + mDisabledComponentsWatched.registerObserver(mSnapshot); + } + mDisabledComponentsWatched.clear(); + mDisabledComponentsWatched.addAll(value); onChanged(); return this; } - public @NonNull PackageUserStateImpl setEnabledComponents(@NonNull ArraySet<String> value) { - mEnabledComponents = value; + public @NonNull PackageUserStateImpl setEnabledComponents(@Nullable ArraySet<String> value) { + if (value == null) { + return this; + } + if (mEnabledComponentsWatched == null) { + mEnabledComponentsWatched = new WatchedArraySet<>(); + mEnabledComponentsWatched.registerObserver(mSnapshot); + } + mEnabledComponentsWatched.clear(); + mEnabledComponentsWatched.addAll(value); + onChanged(); + return this; + } + + public @NonNull PackageUserStateImpl setEnabledComponents( + @Nullable WatchedArraySet<String> value) { + mEnabledComponentsWatched = value; + if (mEnabledComponentsWatched != null) { + mEnabledComponentsWatched.registerObserver(mSnapshot); + } + onChanged(); + return this; + } + + public @NonNull PackageUserStateImpl setDisabledComponents( + @Nullable WatchedArraySet<String> value) { + mDisabledComponentsWatched = value; + if (mDisabledComponentsWatched != null) { + mDisabledComponentsWatched.registerObserver(mSnapshot); + } onChanged(); return this; } @@ -397,7 +482,15 @@ public class PackageUserStateImpl implements PackageUserStateInternal { public @NonNull PackageUserStateImpl setSharedLibraryOverlayPaths( @NonNull ArrayMap<String, OverlayPaths> value) { - mSharedLibraryOverlayPaths = value; + if (value == null) { + return this; + } + if (mSharedLibraryOverlayPaths == null) { + mSharedLibraryOverlayPaths = new WatchedArrayMap<>(); + registerObserver(mSnapshot); + } + mSharedLibraryOverlayPaths.clear(); + mSharedLibraryOverlayPaths.putAll(value); onChanged(); return this; } @@ -413,14 +506,30 @@ public class PackageUserStateImpl implements PackageUserStateInternal { */ public @NonNull PackageUserStateImpl setSuspendParams( @NonNull ArrayMap<String, SuspendParams> value) { - mSuspendParams = value; + if (value == null) { + return this; + } + if (mSuspendParams == null) { + mSuspendParams = new WatchedArrayMap<>(); + registerObserver(mSnapshot); + } + mSuspendParams.clear(); + mSuspendParams.putAll(value); onChanged(); return this; } public @NonNull PackageUserStateImpl setComponentLabelIconOverrideMap( @NonNull ArrayMap<ComponentName, Pair<String, Integer>> value) { - mComponentLabelIconOverrideMap = value; + if (value == null) { + return this; + } + if (mComponentLabelIconOverrideMap == null) { + mComponentLabelIconOverrideMap = new WatchedArrayMap<>(); + registerObserver(mSnapshot); + } + mComponentLabelIconOverrideMap.clear(); + mComponentLabelIconOverrideMap.putAll(value); onChanged(); return this; } @@ -431,6 +540,73 @@ public class PackageUserStateImpl implements PackageUserStateInternal { return this; } + @Override + public boolean equals(@Nullable Object o) { + // You can override field equality logic by defining either of the methods like: + // boolean fieldNameEquals(PackageUserStateImpl other) { ... } + // boolean fieldNameEquals(FieldType otherValue) { ... } + + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + @SuppressWarnings("unchecked") + PackageUserStateImpl that = (PackageUserStateImpl) o; + //noinspection PointlessBooleanExpression + return Objects.equals(mDisabledComponentsWatched, that.mDisabledComponentsWatched) + && Objects.equals(mEnabledComponentsWatched, that.mEnabledComponentsWatched) + && mCeDataInode == that.mCeDataInode + && mInstalled == that.mInstalled + && mStopped == that.mStopped + && mNotLaunched == that.mNotLaunched + && mHidden == that.mHidden + && mDistractionFlags == that.mDistractionFlags + && mInstantApp == that.mInstantApp + && mVirtualPreload == that.mVirtualPreload + && mEnabledState == that.mEnabledState + && mInstallReason == that.mInstallReason + && mUninstallReason == that.mUninstallReason + && Objects.equals(mHarmfulAppWarning, that.mHarmfulAppWarning) + && Objects.equals(mLastDisableAppCaller, that.mLastDisableAppCaller) + && Objects.equals(mOverlayPaths, that.mOverlayPaths) + && Objects.equals(mSharedLibraryOverlayPaths, that.mSharedLibraryOverlayPaths) + && Objects.equals(mSplashScreenTheme, that.mSplashScreenTheme) + && Objects.equals(mSuspendParams, that.mSuspendParams) + && Objects.equals(mComponentLabelIconOverrideMap, + that.mComponentLabelIconOverrideMap) + && mFirstInstallTime == that.mFirstInstallTime + && Objects.equals(mWatchable, that.mWatchable); + } + + @Override + public int hashCode() { + // You can override field hashCode logic by defining methods like: + // int fieldNameHashCode() { ... } + + int _hash = 1; + _hash = 31 * _hash + Objects.hashCode(mDisabledComponentsWatched); + _hash = 31 * _hash + Objects.hashCode(mEnabledComponentsWatched); + _hash = 31 * _hash + Long.hashCode(mCeDataInode); + _hash = 31 * _hash + Boolean.hashCode(mInstalled); + _hash = 31 * _hash + Boolean.hashCode(mStopped); + _hash = 31 * _hash + Boolean.hashCode(mNotLaunched); + _hash = 31 * _hash + Boolean.hashCode(mHidden); + _hash = 31 * _hash + mDistractionFlags; + _hash = 31 * _hash + Boolean.hashCode(mInstantApp); + _hash = 31 * _hash + Boolean.hashCode(mVirtualPreload); + _hash = 31 * _hash + mEnabledState; + _hash = 31 * _hash + mInstallReason; + _hash = 31 * _hash + mUninstallReason; + _hash = 31 * _hash + Objects.hashCode(mHarmfulAppWarning); + _hash = 31 * _hash + Objects.hashCode(mLastDisableAppCaller); + _hash = 31 * _hash + Objects.hashCode(mOverlayPaths); + _hash = 31 * _hash + Objects.hashCode(mSharedLibraryOverlayPaths); + _hash = 31 * _hash + Objects.hashCode(mSplashScreenTheme); + _hash = 31 * _hash + Objects.hashCode(mSuspendParams); + _hash = 31 * _hash + Objects.hashCode(mComponentLabelIconOverrideMap); + _hash = 31 * _hash + Long.hashCode(mFirstInstallTime); + _hash = 31 * _hash + Objects.hashCode(mWatchable); + return _hash; + } + // Code below generated by codegen v1.0.23. @@ -447,13 +623,13 @@ public class PackageUserStateImpl implements PackageUserStateInternal { @DataClass.Generated.Member - public @Nullable ArraySet<String> getDisabledComponents() { - return mDisabledComponents; + public @Nullable WatchedArraySet<String> getDisabledComponentsWatched() { + return mDisabledComponentsWatched; } @DataClass.Generated.Member - public @Nullable ArraySet<String> getEnabledComponents() { - return mEnabledComponents; + public @Nullable WatchedArraySet<String> getEnabledComponentsWatched() { + return mEnabledComponentsWatched; } @DataClass.Generated.Member @@ -527,7 +703,7 @@ public class PackageUserStateImpl implements PackageUserStateInternal { } @DataClass.Generated.Member - public @Nullable ArrayMap<String,OverlayPaths> getSharedLibraryOverlayPaths() { + public @Nullable WatchedArrayMap<String,OverlayPaths> getSharedLibraryOverlayPaths() { return mSharedLibraryOverlayPaths; } @@ -540,12 +716,12 @@ public class PackageUserStateImpl implements PackageUserStateInternal { * Suspending package to suspend params */ @DataClass.Generated.Member - public @Nullable ArrayMap<String,SuspendParams> getSuspendParams() { + public @Nullable WatchedArrayMap<String,SuspendParams> getSuspendParams() { return mSuspendParams; } @DataClass.Generated.Member - public @Nullable ArrayMap<ComponentName,Pair<String,Integer>> getComponentLabelIconOverrideMap() { + public @Nullable WatchedArrayMap<ComponentName,Pair<String,Integer>> getComponentLabelIconOverrideMap() { return mComponentLabelIconOverrideMap; } @@ -559,80 +735,49 @@ public class PackageUserStateImpl implements PackageUserStateInternal { return mWatchable; } - @Override @DataClass.Generated.Member - public boolean equals(@Nullable Object o) { - // You can override field equality logic by defining either of the methods like: - // boolean fieldNameEquals(PackageUserStateImpl other) { ... } - // boolean fieldNameEquals(FieldType otherValue) { ... } + public @NonNull SnapshotCache<PackageUserStateImpl> getSnapshot() { + return mSnapshot; + } - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - @SuppressWarnings("unchecked") - PackageUserStateImpl that = (PackageUserStateImpl) o; - //noinspection PointlessBooleanExpression - return true - && Objects.equals(mDisabledComponents, that.mDisabledComponents) - && Objects.equals(mEnabledComponents, that.mEnabledComponents) - && mCeDataInode == that.mCeDataInode - && mInstalled == that.mInstalled - && mStopped == that.mStopped - && mNotLaunched == that.mNotLaunched - && mHidden == that.mHidden - && mDistractionFlags == that.mDistractionFlags - && mInstantApp == that.mInstantApp - && mVirtualPreload == that.mVirtualPreload - && mEnabledState == that.mEnabledState - && mInstallReason == that.mInstallReason - && mUninstallReason == that.mUninstallReason - && Objects.equals(mHarmfulAppWarning, that.mHarmfulAppWarning) - && Objects.equals(mLastDisableAppCaller, that.mLastDisableAppCaller) - && Objects.equals(mOverlayPaths, that.mOverlayPaths) - && Objects.equals(mSharedLibraryOverlayPaths, that.mSharedLibraryOverlayPaths) - && Objects.equals(mSplashScreenTheme, that.mSplashScreenTheme) - && Objects.equals(mSuspendParams, that.mSuspendParams) - && Objects.equals(mComponentLabelIconOverrideMap, that.mComponentLabelIconOverrideMap) - && mFirstInstallTime == that.mFirstInstallTime - && Objects.equals(mWatchable, that.mWatchable); + @DataClass.Generated.Member + public @NonNull PackageUserStateImpl setDisabledComponentsWatched(@NonNull WatchedArraySet<String> value) { + mDisabledComponentsWatched = value; + return this; } - @Override @DataClass.Generated.Member - public int hashCode() { - // You can override field hashCode logic by defining methods like: - // int fieldNameHashCode() { ... } + public @NonNull PackageUserStateImpl setEnabledComponentsWatched(@NonNull WatchedArraySet<String> value) { + mEnabledComponentsWatched = value; + return this; + } - int _hash = 1; - _hash = 31 * _hash + Objects.hashCode(mDisabledComponents); - _hash = 31 * _hash + Objects.hashCode(mEnabledComponents); - _hash = 31 * _hash + Long.hashCode(mCeDataInode); - _hash = 31 * _hash + Boolean.hashCode(mInstalled); - _hash = 31 * _hash + Boolean.hashCode(mStopped); - _hash = 31 * _hash + Boolean.hashCode(mNotLaunched); - _hash = 31 * _hash + Boolean.hashCode(mHidden); - _hash = 31 * _hash + mDistractionFlags; - _hash = 31 * _hash + Boolean.hashCode(mInstantApp); - _hash = 31 * _hash + Boolean.hashCode(mVirtualPreload); - _hash = 31 * _hash + mEnabledState; - _hash = 31 * _hash + mInstallReason; - _hash = 31 * _hash + mUninstallReason; - _hash = 31 * _hash + Objects.hashCode(mHarmfulAppWarning); - _hash = 31 * _hash + Objects.hashCode(mLastDisableAppCaller); - _hash = 31 * _hash + Objects.hashCode(mOverlayPaths); - _hash = 31 * _hash + Objects.hashCode(mSharedLibraryOverlayPaths); - _hash = 31 * _hash + Objects.hashCode(mSplashScreenTheme); - _hash = 31 * _hash + Objects.hashCode(mSuspendParams); - _hash = 31 * _hash + Objects.hashCode(mComponentLabelIconOverrideMap); - _hash = 31 * _hash + Long.hashCode(mFirstInstallTime); - _hash = 31 * _hash + Objects.hashCode(mWatchable); - return _hash; + @DataClass.Generated.Member + public @NonNull PackageUserStateImpl setSharedLibraryOverlayPaths(@NonNull WatchedArrayMap<String,OverlayPaths> value) { + mSharedLibraryOverlayPaths = value; + return this; + } + + /** + * Suspending package to suspend params + */ + @DataClass.Generated.Member + public @NonNull PackageUserStateImpl setSuspendParams(@NonNull WatchedArrayMap<String,SuspendParams> value) { + mSuspendParams = value; + return this; + } + + @DataClass.Generated.Member + public @NonNull PackageUserStateImpl setComponentLabelIconOverrideMap(@NonNull WatchedArrayMap<ComponentName,Pair<String,Integer>> value) { + mComponentLabelIconOverrideMap = value; + return this; } @DataClass.Generated( - time = 1643854846064L, + time = 1644638242940L, codegenVersion = "1.0.23", sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java", - inputSignatures = "protected @android.annotation.Nullable android.util.ArraySet<java.lang.String> mDisabledComponents\nprotected @android.annotation.Nullable android.util.ArraySet<java.lang.String> mEnabledComponents\nprivate long mCeDataInode\nprivate boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate 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\nprotected @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.annotation.Nullable android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate long mFirstInstallTime\nprivate final @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nprivate void onChanged()\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 android.util.ArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponentsNoCopy()\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 setCeDataInode(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 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 setFirstInstallTime(long)\nclass PackageUserStateImpl extends java.lang.Object implements [com.android.server.pm.pkg.PackageUserStateInternal]\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)") + inputSignatures = "protected @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 boolean mInstalled\nprivate boolean mStopped\nprivate boolean mNotLaunched\nprivate boolean mHidden\nprivate int mDistractionFlags\nprivate boolean mInstantApp\nprivate boolean mVirtualPreload\nprivate 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.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 long mFirstInstallTime\nprivate final @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\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 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 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 setFirstInstallTime(long)\npublic @java.lang.Override boolean equals(java.lang.Object)\npublic @java.lang.Override int hashCode()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\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 bc521ceab1bb..96225c012999 100644 --- a/services/core/java/com/android/server/pm/pkg/PackageUserStateInternal.java +++ b/services/core/java/com/android/server/pm/pkg/PackageUserStateInternal.java @@ -20,10 +20,11 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.content.ComponentName; import android.content.pm.pkg.FrameworkPackageUserState; -import android.util.ArrayMap; -import android.util.ArraySet; import android.util.Pair; +import com.android.server.utils.WatchedArrayMap; +import com.android.server.utils.WatchedArraySet; + /** * Internal variant of {@link PackageUserState} that includes data not exposed as API. This is * still read-only and should be used inside system server code when possible over the @@ -35,13 +36,13 @@ public interface PackageUserStateInternal extends PackageUserState, FrameworkPac // TODO: Make non-null with emptyMap() @Nullable - ArrayMap<String, SuspendParams> getSuspendParams(); + WatchedArrayMap<String, SuspendParams> getSuspendParams(); @Nullable - ArraySet<String> getDisabledComponentsNoCopy(); + WatchedArraySet<String> getDisabledComponentsNoCopy(); @Nullable - ArraySet<String> getEnabledComponentsNoCopy(); + WatchedArraySet<String> getEnabledComponentsNoCopy(); @Nullable Pair<String, Integer> getOverrideLabelIconForComponent(@NonNull ComponentName componentName); diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java index 345f22f063eb..8873f42ff03d 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java @@ -70,6 +70,7 @@ import com.android.server.pm.verify.domain.DomainVerificationManagerInternal; import com.android.server.utils.Watchable; import com.android.server.utils.WatchableTester; import com.android.server.utils.WatchedArrayMap; +import com.android.server.utils.WatchedArraySet; import com.android.server.utils.Watcher; import com.google.common.truth.Truth; @@ -595,13 +596,13 @@ public class PackageManagerSettingsTests { watcher.verifyNoChangeReported("getEnabled"); // Enable/Disable a component - ArraySet<String> components = new ArraySet<String>(); + WatchedArraySet<String> components = new WatchedArraySet<String>(); String component1 = PACKAGE_NAME_1 + "/.Component1"; components.add(component1); ps.setDisabledComponents(components, 0); - ArraySet<String> componentsDisabled = ps.getDisabledComponents(0); + WatchedArraySet<String> componentsDisabled = ps.getDisabledComponents(0); assertThat(componentsDisabled.size(), is(1)); - assertThat(componentsDisabled.toArray()[0], is(component1)); + assertThat(componentsDisabled.untrackedStorage().toArray()[0], is(component1)); boolean hasEnabled = ps.getEnabledComponents(0) != null && ps.getEnabledComponents(1).size() > 0; assertThat(hasEnabled, is(false)); @@ -704,7 +705,7 @@ public class PackageManagerSettingsTests { null /*usesStaticLibrariesVersions*/, null /*mimeGroups*/, UUID.randomUUID()); - testPkgSetting01.copyPackageSetting(origPkgSetting01); + testPkgSetting01.copyPackageSetting(origPkgSetting01, true); verifySettingCopy(origPkgSetting01, testPkgSetting01); verifyUserStatesCopy(origPkgSetting01.readUserState(0), testPkgSetting01.readUserState(0)); diff --git a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java index a0edb85e64e1..4dc9612acda3 100644 --- a/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java +++ b/services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java @@ -39,6 +39,7 @@ import com.android.server.pm.pkg.PackageStateUnserialized; import com.android.server.pm.pkg.PackageUserStateImpl; import com.android.server.pm.pkg.SuspendParams; +import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mockito; @@ -238,9 +239,12 @@ public class PackageUserStateTest { PackageUserStateImpl testUserState2 = new PackageUserStateImpl(null, testUserState1); assertThat(testUserState1.equals(testUserState2), is(true)); - testUserState2.setSuspendParams(paramsMap2); - // Should not be equal since suspendParams maps are different - assertThat(testUserState1.equals(testUserState2), is(false)); + try { + testUserState2.setSuspendParams(paramsMap2); + Assert.fail("Changing sealed snapshot of suspendParams should throw"); + } catch (IllegalStateException e) { + assertThat(e.getMessage().contains("attempt to change a sealed object"), is(true)); + } } @Test |