blob: 7a5a14d8d3c21f81af26893d9561531e2db290ab [file] [log] [blame]
/*
* Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.server.pm.pkg;
import android.annotation.CurrentTimeMillisLong;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.content.pm.UserPackage;
import android.content.pm.overlay.OverlayPaths;
import android.text.TextUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair;
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.Collections;
import java.util.Map;
import java.util.Objects;
/** @hide */
@DataClass(genConstructor = false, genBuilder = false, genEqualsHashCode = true)
@DataClass.Suppress({"mOverlayPathsLock", "mOverlayPaths", "mSharedLibraryOverlayPathsLock",
"mSharedLibraryOverlayPaths", "setOverlayPaths", "setCachedOverlayPaths", "getWatchable",
"getBooleans"
})
public class PackageUserStateImpl extends WatchableImpl implements PackageUserStateInternal,
Snappable {
// Use a bitset to store boolean data to save memory
private static class Booleans {
@IntDef({
INSTALLED,
STOPPED,
NOT_LAUNCHED,
HIDDEN,
INSTANT_APP,
VIRTUAL_PRELOADED,
})
public @interface Flags {
}
private static final int INSTALLED = 1;
private static final int STOPPED = 1 << 1;
private static final int NOT_LAUNCHED = 1 << 2;
// Is the app restricted by owner / admin
private static final int HIDDEN = 1 << 3;
private static final int INSTANT_APP = 1 << 4;
private static final int VIRTUAL_PRELOADED = 1 << 5;
}
private int mBooleans;
private void setBoolean(@Booleans.Flags int flag, boolean value) {
if (value) {
mBooleans |= flag;
} else {
mBooleans &= ~flag;
}
}
private boolean getBoolean(@Booleans.Flags int flag) {
return (mBooleans & flag) != 0;
}
@Nullable
protected WatchedArraySet<String> mDisabledComponentsWatched;
@Nullable
protected WatchedArraySet<String> mEnabledComponentsWatched;
private long mCeDataInode;
private long mDeDataInode;
private int mDistractionFlags;
@PackageManager.EnabledState
private int mEnabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
@PackageManager.InstallReason
private int mInstallReason = PackageManager.INSTALL_REASON_UNKNOWN;
@PackageManager.UninstallReason
private int mUninstallReason = PackageManager.UNINSTALL_REASON_UNKNOWN;
@Nullable
private String mHarmfulAppWarning;
@Nullable
private String mLastDisableAppCaller;
@Nullable
private OverlayPaths mOverlayPaths;
// Lib name to overlay paths
@Nullable
protected WatchedArrayMap<String, OverlayPaths> mSharedLibraryOverlayPaths;
@Nullable
private String mSplashScreenTheme;
@PackageManager.UserMinAspectRatio
private int mMinAspectRatio = PackageManager.USER_MIN_ASPECT_RATIO_UNSET;
/**
* Suspending package to suspend params
*/
@Nullable
private WatchedArrayMap<UserPackage, SuspendParams> mSuspendParams;
@Nullable
private WatchedArrayMap<ComponentName, Pair<String, Integer>> mComponentLabelIconOverrideMap;
private @CurrentTimeMillisLong long mFirstInstallTimeMillis;
// TODO(b/239050028): Remove, enforce notifying parent through PMS commit method
@Nullable
private Watchable mWatchable;
@Nullable
private ArchiveState mArchiveState;
@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();
setBoolean(Booleans.INSTALLED, true);
}
public PackageUserStateImpl(@NonNull Watchable watchable) {
mWatchable = watchable;
mSnapshot = makeCache();
setBoolean(Booleans.INSTALLED, true);
}
public PackageUserStateImpl(@NonNull Watchable watchable, PackageUserStateImpl other) {
mWatchable = watchable;
mBooleans = other.mBooleans;
mDisabledComponentsWatched = other.mDisabledComponentsWatched == null
? null : other.mDisabledComponentsWatched.snapshot();
mEnabledComponentsWatched = other.mEnabledComponentsWatched == null
? null : other.mEnabledComponentsWatched.snapshot();
mOverlayPaths = other.mOverlayPaths;
mSharedLibraryOverlayPaths = other.mSharedLibraryOverlayPaths == null
? null : other.mSharedLibraryOverlayPaths.snapshot();
mCeDataInode = other.mCeDataInode;
mDeDataInode = other.mDeDataInode;
mDistractionFlags = other.mDistractionFlags;
mEnabledState = other.mEnabledState;
mInstallReason = other.mInstallReason;
mUninstallReason = other.mUninstallReason;
mHarmfulAppWarning = other.mHarmfulAppWarning;
mLastDisableAppCaller = other.mLastDisableAppCaller;
mSplashScreenTheme = other.mSplashScreenTheme;
mMinAspectRatio = other.mMinAspectRatio;
mSuspendParams = other.mSuspendParams == null ? null : other.mSuspendParams.snapshot();
mComponentLabelIconOverrideMap = other.mComponentLabelIconOverrideMap == null
? null : other.mComponentLabelIconOverrideMap.snapshot();
mFirstInstallTimeMillis = other.mFirstInstallTimeMillis;
mArchiveState = other.mArchiveState;
mSnapshot = new SnapshotCache.Sealed<>();
}
private void onChanged() {
if (mWatchable != null) {
mWatchable.dispatchChange(mWatchable);
}
dispatchChange(this);
}
@NonNull
@Override
public PackageUserStateImpl snapshot() {
return mSnapshot.snapshot();
}
/**
* Sets the path of overlays currently enabled for this package and user combination.
*
* @return true if the path contents differ than what they were previously
*/
@Nullable
public boolean setOverlayPaths(@Nullable OverlayPaths paths) {
if (Objects.equals(paths, mOverlayPaths)) {
return false;
}
if ((mOverlayPaths == null && paths.isEmpty())
|| (paths == null && mOverlayPaths.isEmpty())) {
return false;
}
mOverlayPaths = paths;
onChanged();
return true;
}
/**
* Sets the path of overlays currently enabled for a library that this package uses.
*
* @return true if the path contents for the library differ than what they were previously
*/
public boolean setSharedLibraryOverlayPaths(@NonNull String library,
@Nullable OverlayPaths paths) {
if (mSharedLibraryOverlayPaths == null) {
mSharedLibraryOverlayPaths = new WatchedArrayMap<>();
mSharedLibraryOverlayPaths.registerObserver(mSnapshot);
}
final OverlayPaths currentPaths = mSharedLibraryOverlayPaths.get(library);
if (Objects.equals(paths, currentPaths)) {
return false;
}
if (paths == null || paths.isEmpty()) {
boolean returnValue = mSharedLibraryOverlayPaths.remove(library) != null;
onChanged();
return returnValue;
} else {
mSharedLibraryOverlayPaths.put(library, paths);
onChanged();
return true;
}
}
@Nullable
@Override
public WatchedArraySet<String> getDisabledComponentsNoCopy() {
return mDisabledComponentsWatched;
}
@Nullable
@Override
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) {
return mEnabledComponentsWatched != null
&& mEnabledComponentsWatched.contains(componentName);
}
@Override
public boolean isComponentDisabled(String componentName) {
return mDisabledComponentsWatched != null
&& mDisabledComponentsWatched.contains(componentName);
}
@Override
public OverlayPaths getAllOverlayPaths() {
if (mOverlayPaths == null && mSharedLibraryOverlayPaths == null) {
return null;
}
final OverlayPaths.Builder newPaths = new OverlayPaths.Builder();
newPaths.addAll(mOverlayPaths);
if (mSharedLibraryOverlayPaths != null) {
for (final OverlayPaths libOverlayPaths : mSharedLibraryOverlayPaths.values()) {
newPaths.addAll(libOverlayPaths);
}
}
return newPaths.build();
}
/**
* Overrides the non-localized label and icon of a component.
*
* @return true if the label or icon was changed.
*/
@VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
public boolean overrideLabelAndIcon(@NonNull ComponentName component,
@Nullable String nonLocalizedLabel, @Nullable Integer icon) {
String existingLabel = null;
Integer existingIcon = null;
if (mComponentLabelIconOverrideMap != null) {
Pair<String, Integer> pair = mComponentLabelIconOverrideMap.get(component);
if (pair != null) {
existingLabel = pair.first;
existingIcon = pair.second;
}
}
boolean changed = !TextUtils.equals(existingLabel, nonLocalizedLabel)
|| !Objects.equals(existingIcon, icon);
if (changed) {
if (nonLocalizedLabel == null && icon == null) {
mComponentLabelIconOverrideMap.remove(component);
if (mComponentLabelIconOverrideMap.isEmpty()) {
mComponentLabelIconOverrideMap = null;
}
} else {
if (mComponentLabelIconOverrideMap == null) {
mComponentLabelIconOverrideMap = new WatchedArrayMap<>(1);
mComponentLabelIconOverrideMap.registerObserver(mSnapshot);
}
mComponentLabelIconOverrideMap.put(component, Pair.create(nonLocalizedLabel, icon));
}
onChanged();
}
return changed;
}
/**
* Clears all values previously set by {@link #overrideLabelAndIcon(ComponentName, String,
* Integer)}.
* <p>
* This is done when the package is updated as the components and resource IDs may have
* changed.
*/
public void resetOverrideComponentLabelIcon() {
mComponentLabelIconOverrideMap = null;
}
@Nullable
public Pair<String, Integer> getOverrideLabelIconForComponent(ComponentName componentName) {
if (ArrayUtils.isEmpty(mComponentLabelIconOverrideMap)) {
return null;
}
return mComponentLabelIconOverrideMap.get(componentName);
}
@Override
public boolean isSuspended() {
return !CollectionUtils.isEmpty(mSuspendParams);
}
/**
* Adds or updates suspension params by the given package.
*/
public PackageUserStateImpl putSuspendParams(@NonNull UserPackage suspendingPackage,
@Nullable SuspendParams suspendParams) {
if (mSuspendParams == null) {
mSuspendParams = new WatchedArrayMap<>();
mSuspendParams.registerObserver(mSnapshot);
}
if (!mSuspendParams.containsKey(suspendingPackage)
|| !Objects.equals(mSuspendParams.get(suspendingPackage), suspendParams)) {
mSuspendParams.put(suspendingPackage, suspendParams);
onChanged();
}
return this;
}
/**
* Removes suspension by the given package.
*/
public PackageUserStateImpl removeSuspension(@NonNull UserPackage suspendingPackage) {
if (mSuspendParams != null) {
mSuspendParams.remove(suspendingPackage);
onChanged();
}
return this;
}
public @NonNull PackageUserStateImpl setDisabledComponents(@Nullable ArraySet<String> value) {
if (mDisabledComponentsWatched == null) {
mDisabledComponentsWatched = new WatchedArraySet<>();
mDisabledComponentsWatched.registerObserver(mSnapshot);
}
mDisabledComponentsWatched.clear();
if (value != null) {
mDisabledComponentsWatched.addAll(value);
}
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setEnabledComponents(@Nullable ArraySet<String> value) {
if (mEnabledComponentsWatched == null) {
mEnabledComponentsWatched = new WatchedArraySet<>();
mEnabledComponentsWatched.registerObserver(mSnapshot);
}
mEnabledComponentsWatched.clear();
if (value != null) {
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;
}
public @NonNull PackageUserStateImpl setCeDataInode(long value) {
mCeDataInode = value;
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setDeDataInode(long value) {
mDeDataInode = value;
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setInstalled(boolean value) {
setBoolean(Booleans.INSTALLED, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setStopped(boolean value) {
setBoolean(Booleans.STOPPED, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setNotLaunched(boolean value) {
setBoolean(Booleans.NOT_LAUNCHED, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setHidden(boolean value) {
setBoolean(Booleans.HIDDEN, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setDistractionFlags(int value) {
mDistractionFlags = value;
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setInstantApp(boolean value) {
setBoolean(Booleans.INSTANT_APP, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setVirtualPreload(boolean value) {
setBoolean(Booleans.VIRTUAL_PRELOADED, value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setEnabledState(int value) {
mEnabledState = value;
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setInstallReason(@PackageManager.InstallReason int value) {
mInstallReason = value;
com.android.internal.util.AnnotationValidations.validate(
PackageManager.InstallReason.class, null, mInstallReason);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setUninstallReason(
@PackageManager.UninstallReason int value) {
mUninstallReason = value;
com.android.internal.util.AnnotationValidations.validate(
PackageManager.UninstallReason.class, null, mUninstallReason);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setHarmfulAppWarning(@NonNull String value) {
mHarmfulAppWarning = value;
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setLastDisableAppCaller(@NonNull String value) {
mLastDisableAppCaller = value;
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setSharedLibraryOverlayPaths(
@NonNull ArrayMap<String, OverlayPaths> value) {
if (value == null) {
return this;
}
if (mSharedLibraryOverlayPaths == null) {
mSharedLibraryOverlayPaths = new WatchedArrayMap<>();
registerObserver(mSnapshot);
}
mSharedLibraryOverlayPaths.clear();
mSharedLibraryOverlayPaths.putAll(value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setSplashScreenTheme(@NonNull String value) {
mSplashScreenTheme = value;
onChanged();
return this;
}
/**
* Sets user min aspect ratio override value
* @see PackageManager.UserMinAspectRatio
*/
public @NonNull PackageUserStateImpl setMinAspectRatio(
@PackageManager.UserMinAspectRatio int value) {
mMinAspectRatio = value;
com.android.internal.util.AnnotationValidations.validate(
PackageManager.UserMinAspectRatio.class, null, mMinAspectRatio);
onChanged();
return this;
}
/**
* Suspending package to suspend params
*/
public @NonNull PackageUserStateImpl setSuspendParams(
@NonNull ArrayMap<UserPackage, SuspendParams> 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) {
if (value == null) {
return this;
}
if (mComponentLabelIconOverrideMap == null) {
mComponentLabelIconOverrideMap = new WatchedArrayMap<>();
registerObserver(mSnapshot);
}
mComponentLabelIconOverrideMap.clear();
mComponentLabelIconOverrideMap.putAll(value);
onChanged();
return this;
}
public @NonNull PackageUserStateImpl setFirstInstallTimeMillis(long value) {
mFirstInstallTimeMillis = value;
onChanged();
return this;
}
/**
* Sets the value for {@link #getArchiveState()}.
*/
@NonNull
public PackageUserStateImpl setArchiveState(@NonNull ArchiveState archiveState) {
mArchiveState = archiveState;
onChanged();
return this;
}
@NonNull
@Override
public Map<String, OverlayPaths> getSharedLibraryOverlayPaths() {
return mSharedLibraryOverlayPaths == null
? Collections.emptyMap() : mSharedLibraryOverlayPaths;
}
@NonNull
public PackageUserStateImpl setWatchable(@NonNull Watchable watchable) {
mWatchable = watchable;
return this;
}
private boolean watchableEquals(Watchable other) {
// Ignore the Watchable for equality
return true;
}
private int watchableHashCode() {
// Ignore the Watchable for equality
return 0;
}
private boolean snapshotEquals(SnapshotCache<PackageUserStateImpl> other) {
// Ignore the SnapshotCache for equality
return true;
}
private int snapshotHashCode() {
// Ignore the SnapshotCache for equality
return 0;
}
@Override
public boolean isInstalled() {
return getBoolean(Booleans.INSTALLED);
}
@Override
public boolean isStopped() {
return getBoolean(Booleans.STOPPED);
}
@Override
public boolean isNotLaunched() {
return getBoolean(Booleans.NOT_LAUNCHED);
}
@Override
public boolean isHidden() {
return getBoolean(Booleans.HIDDEN);
}
@Override
public boolean isInstantApp() {
return getBoolean(Booleans.INSTANT_APP);
}
@Override
public boolean isVirtualPreload() {
return getBoolean(Booleans.VIRTUAL_PRELOADED);
}
@Override
public boolean isQuarantined() {
if (!isSuspended()) {
return false;
}
final var suspendParams = mSuspendParams;
for (int i = 0, size = suspendParams.size(); i < size; i++) {
final SuspendParams params = suspendParams.valueAt(i);
if (params.isQuarantined()) {
return true;
}
}
return false;
}
@Override
public boolean dataExists() {
return getCeDataInode() > 0 || getDeDataInode() > 0;
}
// Code below generated by codegen v1.0.23.
//
// DO NOT MODIFY!
// CHECKSTYLE:OFF Generated code
//
// To regenerate run:
// $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
//
// To exclude the generated code from IntelliJ auto-formatting enable (one-time):
// Settings > Editor > Code Style > Formatter Control
//@formatter:off
@DataClass.Generated.Member
public @Nullable WatchedArraySet<String> getDisabledComponentsWatched() {
return mDisabledComponentsWatched;
}
@DataClass.Generated.Member
public @Nullable WatchedArraySet<String> getEnabledComponentsWatched() {
return mEnabledComponentsWatched;
}
@DataClass.Generated.Member
public long getCeDataInode() {
return mCeDataInode;
}
@DataClass.Generated.Member
public long getDeDataInode() {
return mDeDataInode;
}
@DataClass.Generated.Member
public int getDistractionFlags() {
return mDistractionFlags;
}
@DataClass.Generated.Member
public @PackageManager.EnabledState int getEnabledState() {
return mEnabledState;
}
@DataClass.Generated.Member
public @PackageManager.InstallReason int getInstallReason() {
return mInstallReason;
}
@DataClass.Generated.Member
public @PackageManager.UninstallReason int getUninstallReason() {
return mUninstallReason;
}
@DataClass.Generated.Member
public @Nullable String getHarmfulAppWarning() {
return mHarmfulAppWarning;
}
@DataClass.Generated.Member
public @Nullable String getLastDisableAppCaller() {
return mLastDisableAppCaller;
}
@DataClass.Generated.Member
public @Nullable OverlayPaths getOverlayPaths() {
return mOverlayPaths;
}
@DataClass.Generated.Member
public @Nullable String getSplashScreenTheme() {
return mSplashScreenTheme;
}
@DataClass.Generated.Member
public @PackageManager.UserMinAspectRatio int getMinAspectRatio() {
return mMinAspectRatio;
}
/**
* Suspending package to suspend params
*/
@DataClass.Generated.Member
public @Nullable WatchedArrayMap<UserPackage,SuspendParams> getSuspendParams() {
return mSuspendParams;
}
@DataClass.Generated.Member
public @Nullable WatchedArrayMap<ComponentName,Pair<String,Integer>> getComponentLabelIconOverrideMap() {
return mComponentLabelIconOverrideMap;
}
@DataClass.Generated.Member
public @CurrentTimeMillisLong long getFirstInstallTimeMillis() {
return mFirstInstallTimeMillis;
}
@DataClass.Generated.Member
public @Nullable ArchiveState getArchiveState() {
return mArchiveState;
}
@DataClass.Generated.Member
public @NonNull SnapshotCache<PackageUserStateImpl> getSnapshot() {
return mSnapshot;
}
@DataClass.Generated.Member
public @NonNull PackageUserStateImpl setBooleans( int value) {
mBooleans = value;
return this;
}
@DataClass.Generated.Member
public @NonNull PackageUserStateImpl setDisabledComponentsWatched(@NonNull WatchedArraySet<String> value) {
mDisabledComponentsWatched = value;
return this;
}
@DataClass.Generated.Member
public @NonNull PackageUserStateImpl setEnabledComponentsWatched(@NonNull WatchedArraySet<String> value) {
mEnabledComponentsWatched = value;
return this;
}
@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<UserPackage,SuspendParams> value) {
mSuspendParams = value;
return this;
}
@DataClass.Generated.Member
public @NonNull PackageUserStateImpl setComponentLabelIconOverrideMap(@NonNull WatchedArrayMap<ComponentName,Pair<String,Integer>> value) {
mComponentLabelIconOverrideMap = value;
return this;
}
@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) { ... }
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
@SuppressWarnings("unchecked")
PackageUserStateImpl that = (PackageUserStateImpl) o;
//noinspection PointlessBooleanExpression
return true
&& mBooleans == that.mBooleans
&& Objects.equals(mDisabledComponentsWatched, that.mDisabledComponentsWatched)
&& Objects.equals(mEnabledComponentsWatched, that.mEnabledComponentsWatched)
&& mCeDataInode == that.mCeDataInode
&& mDeDataInode == that.mDeDataInode
&& mDistractionFlags == that.mDistractionFlags
&& 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)
&& mMinAspectRatio == that.mMinAspectRatio
&& Objects.equals(mSuspendParams, that.mSuspendParams)
&& Objects.equals(mComponentLabelIconOverrideMap, that.mComponentLabelIconOverrideMap)
&& mFirstInstallTimeMillis == that.mFirstInstallTimeMillis
&& watchableEquals(that.mWatchable)
&& Objects.equals(mArchiveState, that.mArchiveState)
&& snapshotEquals(that.mSnapshot);
}
@Override
@DataClass.Generated.Member
public int hashCode() {
// You can override field hashCode logic by defining methods like:
// int fieldNameHashCode() { ... }
int _hash = 1;
_hash = 31 * _hash + mBooleans;
_hash = 31 * _hash + Objects.hashCode(mDisabledComponentsWatched);
_hash = 31 * _hash + Objects.hashCode(mEnabledComponentsWatched);
_hash = 31 * _hash + Long.hashCode(mCeDataInode);
_hash = 31 * _hash + Long.hashCode(mDeDataInode);
_hash = 31 * _hash + mDistractionFlags;
_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 + mMinAspectRatio;
_hash = 31 * _hash + Objects.hashCode(mSuspendParams);
_hash = 31 * _hash + Objects.hashCode(mComponentLabelIconOverrideMap);
_hash = 31 * _hash + Long.hashCode(mFirstInstallTimeMillis);
_hash = 31 * _hash + watchableHashCode();
_hash = 31 * _hash + Objects.hashCode(mArchiveState);
_hash = 31 * _hash + snapshotHashCode();
return _hash;
}
@DataClass.Generated(
time = 1701864813354L,
codegenVersion = "1.0.23",
sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java",
inputSignatures = "private int mBooleans\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mDisabledComponentsWatched\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArraySet<java.lang.String> mEnabledComponentsWatched\nprivate long mCeDataInode\nprivate long mDeDataInode\nprivate int mDistractionFlags\nprivate @android.content.pm.PackageManager.EnabledState int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.content.pm.PackageManager.UserMinAspectRatio int mMinAspectRatio\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.pm.UserPackage,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate @android.annotation.CurrentTimeMillisLong long mFirstInstallTimeMillis\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\nprivate @android.annotation.Nullable com.android.server.pm.pkg.ArchiveState mArchiveState\nfinal @android.annotation.NonNull com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> mSnapshot\nprivate void setBoolean(int,boolean)\nprivate boolean getBoolean(int)\nprivate com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl> makeCache()\nprivate void onChanged()\npublic @android.annotation.NonNull @java.lang.Override com.android.server.pm.pkg.PackageUserStateImpl snapshot()\npublic @android.annotation.Nullable boolean setOverlayPaths(android.content.pm.overlay.OverlayPaths)\npublic boolean setSharedLibraryOverlayPaths(java.lang.String,android.content.pm.overlay.OverlayPaths)\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getDisabledComponentsNoCopy()\npublic @android.annotation.Nullable @java.lang.Override com.android.server.utils.WatchedArraySet<java.lang.String> getEnabledComponentsNoCopy()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getDisabledComponents()\npublic @android.annotation.NonNull @java.lang.Override android.util.ArraySet<java.lang.String> getEnabledComponents()\npublic @java.lang.Override boolean isComponentEnabled(java.lang.String)\npublic @java.lang.Override boolean isComponentDisabled(java.lang.String)\npublic @java.lang.Override android.content.pm.overlay.OverlayPaths getAllOverlayPaths()\npublic @com.android.internal.annotations.VisibleForTesting boolean overrideLabelAndIcon(android.content.ComponentName,java.lang.String,java.lang.Integer)\npublic void resetOverrideComponentLabelIcon()\npublic @android.annotation.Nullable android.util.Pair<java.lang.String,java.lang.Integer> getOverrideLabelIconForComponent(android.content.ComponentName)\npublic @java.lang.Override boolean isSuspended()\npublic com.android.server.pm.pkg.PackageUserStateImpl putSuspendParams(android.content.pm.UserPackage,com.android.server.pm.pkg.SuspendParams)\npublic com.android.server.pm.pkg.PackageUserStateImpl removeSuspension(android.content.pm.UserPackage)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(android.util.ArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDisabledComponents(com.android.server.utils.WatchedArraySet<java.lang.String>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setCeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDeDataInode(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstalled(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setStopped(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setNotLaunched(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHidden(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setDistractionFlags(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstantApp(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setVirtualPreload(boolean)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setEnabledState(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setInstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setUninstallReason(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setHarmfulAppWarning(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setLastDisableAppCaller(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSharedLibraryOverlayPaths(android.util.ArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSplashScreenTheme(java.lang.String)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setMinAspectRatio(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<android.content.pm.UserPackage,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTimeMillis(long)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setArchiveState(com.android.server.pm.pkg.ArchiveState)\npublic @android.annotation.NonNull @java.lang.Override java.util.Map<java.lang.String,android.content.pm.overlay.OverlayPaths> getSharedLibraryOverlayPaths()\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setWatchable(com.android.server.utils.Watchable)\nprivate boolean watchableEquals(com.android.server.utils.Watchable)\nprivate int watchableHashCode()\nprivate boolean snapshotEquals(com.android.server.utils.SnapshotCache<com.android.server.pm.pkg.PackageUserStateImpl>)\nprivate int snapshotHashCode()\npublic @java.lang.Override boolean isInstalled()\npublic @java.lang.Override boolean isStopped()\npublic @java.lang.Override boolean isNotLaunched()\npublic @java.lang.Override boolean isHidden()\npublic @java.lang.Override boolean isInstantApp()\npublic @java.lang.Override boolean isVirtualPreload()\npublic @java.lang.Override boolean isQuarantined()\npublic @java.lang.Override boolean dataExists()\nclass PackageUserStateImpl extends com.android.server.utils.WatchableImpl implements [com.android.server.pm.pkg.PackageUserStateInternal, com.android.server.utils.Snappable]\nprivate static final int INSTALLED\nprivate static final int STOPPED\nprivate static final int NOT_LAUNCHED\nprivate static final int HIDDEN\nprivate static final int INSTANT_APP\nprivate static final int VIRTUAL_PRELOADED\nclass Booleans extends java.lang.Object implements []\n@com.android.internal.util.DataClass(genConstructor=false, genBuilder=false, genEqualsHashCode=true)")
@Deprecated
private void __metadata() {}
//@formatter:on
// End of generated code
}