summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java4
-rw-r--r--services/core/java/com/android/server/pm/PackageSetting.java43
-rw-r--r--services/core/java/com/android/server/pm/Settings.java28
-rw-r--r--services/core/java/com/android/server/pm/SuspendPackageHelper.java9
-rw-r--r--services/core/java/com/android/server/pm/pkg/PackageStateImpl.java10
-rw-r--r--services/core/java/com/android/server/pm/pkg/PackageUserState.java8
-rw-r--r--services/core/java/com/android/server/pm/pkg/PackageUserStateDefault.java19
-rw-r--r--services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java351
-rw-r--r--services/core/java/com/android/server/pm/pkg/PackageUserStateInternal.java11
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageManagerSettingsTests.java9
-rw-r--r--services/tests/servicestests/src/com/android/server/pm/PackageUserStateTest.java10
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