1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.pm.pkg;
18 
19 import android.annotation.CurrentTimeMillisLong;
20 import android.annotation.NonNull;
21 import android.annotation.Nullable;
22 import android.content.ComponentName;
23 import android.content.pm.PackageManager;
24 import android.content.pm.overlay.OverlayPaths;
25 import android.text.TextUtils;
26 import android.util.ArrayMap;
27 import android.util.ArraySet;
28 import android.util.Pair;
29 
30 import com.android.internal.annotations.VisibleForTesting;
31 import com.android.internal.util.ArrayUtils;
32 import com.android.internal.util.CollectionUtils;
33 import com.android.internal.util.DataClass;
34 import com.android.server.utils.Snappable;
35 import com.android.server.utils.SnapshotCache;
36 import com.android.server.utils.Watchable;
37 import com.android.server.utils.WatchableImpl;
38 import com.android.server.utils.WatchedArrayMap;
39 import com.android.server.utils.WatchedArraySet;
40 
41 import java.util.Collections;
42 import java.util.Map;
43 import java.util.Objects;
44 
45 /** @hide */
46 @DataClass(genConstructor = false, genBuilder = false, genEqualsHashCode = true)
47 @DataClass.Suppress({"mOverlayPathsLock", "mOverlayPaths", "mSharedLibraryOverlayPathsLock",
48         "mSharedLibraryOverlayPaths", "setOverlayPaths", "setCachedOverlayPaths", "getWatchable"})
49 public class PackageUserStateImpl extends WatchableImpl implements PackageUserStateInternal,
50         Snappable {
51 
52     @Nullable
53     protected WatchedArraySet<String> mDisabledComponentsWatched;
54     @Nullable
55     protected WatchedArraySet<String> mEnabledComponentsWatched;
56 
57     private long mCeDataInode;
58     private boolean mInstalled = true;
59     private boolean mStopped;
60     private boolean mNotLaunched;
61     private boolean mHidden; // Is the app restricted by owner / admin
62     private int mDistractionFlags;
63     private boolean mInstantApp;
64     private boolean mVirtualPreload;
65     @PackageManager.EnabledState
66     private int mEnabledState = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT;
67     @PackageManager.InstallReason
68     private int mInstallReason = PackageManager.INSTALL_REASON_UNKNOWN;
69     @PackageManager.UninstallReason
70     private int mUninstallReason = PackageManager.UNINSTALL_REASON_UNKNOWN;
71     @Nullable
72     private String mHarmfulAppWarning;
73     @Nullable
74     private String mLastDisableAppCaller;
75 
76     @Nullable
77     private OverlayPaths mOverlayPaths;
78 
79     // Lib name to overlay paths
80     @Nullable
81     protected WatchedArrayMap<String, OverlayPaths> mSharedLibraryOverlayPaths;
82 
83     @Nullable
84     private String mSplashScreenTheme;
85 
86     @PackageManager.UserMinAspectRatio
87     private int mMinAspectRatio = PackageManager.USER_MIN_ASPECT_RATIO_UNSET;
88 
89     /**
90      * Suspending package to suspend params
91      */
92     @Nullable
93     private WatchedArrayMap<String, SuspendParams> mSuspendParams;
94 
95     @Nullable
96     private WatchedArrayMap<ComponentName, Pair<String, Integer>> mComponentLabelIconOverrideMap;
97 
98     private @CurrentTimeMillisLong long mFirstInstallTimeMillis;
99 
100     // TODO(b/239050028): Remove, enforce notifying parent through PMS commit method
101     @Nullable
102     private Watchable mWatchable;
103 
104     @NonNull
105     final SnapshotCache<PackageUserStateImpl> mSnapshot;
106 
makeCache()107     private SnapshotCache<PackageUserStateImpl> makeCache() {
108         return new SnapshotCache<PackageUserStateImpl>(this, this) {
109             @Override
110             public PackageUserStateImpl createSnapshot() {
111                 return new PackageUserStateImpl(mWatchable, mSource);
112             }};
113     }
114 
115     /**
116      * Only used for tests
117      */
118     public PackageUserStateImpl() {
119         super();
120         mWatchable = null;
121         mSnapshot = makeCache();
122     }
123 
124     public PackageUserStateImpl(@NonNull Watchable watchable) {
125         mWatchable = watchable;
126         mSnapshot = makeCache();
127     }
128 
129     public PackageUserStateImpl(@NonNull Watchable watchable, PackageUserStateImpl other) {
130         mWatchable = watchable;
131         mDisabledComponentsWatched = other.mDisabledComponentsWatched == null
132                 ? null : other.mDisabledComponentsWatched.snapshot();
133         mEnabledComponentsWatched =  other.mEnabledComponentsWatched == null
134                 ? null : other.mEnabledComponentsWatched.snapshot();
135         mOverlayPaths = other.mOverlayPaths;
136         mSharedLibraryOverlayPaths = other.mSharedLibraryOverlayPaths == null
137                 ? null : other.mSharedLibraryOverlayPaths.snapshot();
138         mCeDataInode = other.mCeDataInode;
139         mInstalled = other.mInstalled;
140         mStopped = other.mStopped;
141         mNotLaunched = other.mNotLaunched;
142         mHidden = other.mHidden;
143         mDistractionFlags = other.mDistractionFlags;
144         mInstantApp = other.mInstantApp;
145         mVirtualPreload = other.mVirtualPreload;
146         mEnabledState = other.mEnabledState;
147         mInstallReason = other.mInstallReason;
148         mUninstallReason = other.mUninstallReason;
149         mHarmfulAppWarning = other.mHarmfulAppWarning;
150         mLastDisableAppCaller = other.mLastDisableAppCaller;
151         mSplashScreenTheme = other.mSplashScreenTheme;
152         mMinAspectRatio = other.mMinAspectRatio;
153         mSuspendParams = other.mSuspendParams == null ? null : other.mSuspendParams.snapshot();
154         mComponentLabelIconOverrideMap = other.mComponentLabelIconOverrideMap == null
155                 ? null : other.mComponentLabelIconOverrideMap.snapshot();
156         mFirstInstallTimeMillis = other.mFirstInstallTimeMillis;
157         mSnapshot = new SnapshotCache.Sealed<>();
158     }
159 
160     private void onChanged() {
161         if (mWatchable != null) {
162             mWatchable.dispatchChange(mWatchable);
163         }
164         dispatchChange(this);
165     }
166 
167     @NonNull
168     @Override
169     public PackageUserStateImpl snapshot() {
170         return mSnapshot.snapshot();
171     }
172 
173     /**
174      * Sets the path of overlays currently enabled for this package and user combination.
175      *
176      * @return true if the path contents differ than what they were previously
177      */
178     @Nullable
179     public boolean setOverlayPaths(@Nullable OverlayPaths paths) {
180         if (Objects.equals(paths, mOverlayPaths)) {
181             return false;
182         }
183         if ((mOverlayPaths == null && paths.isEmpty())
184                 || (paths == null && mOverlayPaths.isEmpty())) {
185             return false;
186         }
187         mOverlayPaths = paths;
188         onChanged();
189         return true;
190     }
191 
192     /**
193      * Sets the path of overlays currently enabled for a library that this package uses.
194      *
195      * @return true if the path contents for the library differ than what they were previously
196      */
197     public boolean setSharedLibraryOverlayPaths(@NonNull String library,
198             @Nullable OverlayPaths paths) {
199         if (mSharedLibraryOverlayPaths == null) {
200             mSharedLibraryOverlayPaths = new WatchedArrayMap<>();
201             mSharedLibraryOverlayPaths.registerObserver(mSnapshot);
202         }
203         final OverlayPaths currentPaths = mSharedLibraryOverlayPaths.get(library);
204         if (Objects.equals(paths, currentPaths)) {
205             return false;
206         }
207         if (paths == null || paths.isEmpty()) {
208             boolean returnValue = mSharedLibraryOverlayPaths.remove(library) != null;
209             onChanged();
210             return returnValue;
211         } else {
212             mSharedLibraryOverlayPaths.put(library, paths);
213             onChanged();
214             return true;
215         }
216     }
217 
218     @Nullable
219     @Override
220     public WatchedArraySet<String> getDisabledComponentsNoCopy() {
221         return mDisabledComponentsWatched;
222     }
223 
224     @Nullable
225     @Override
226     public WatchedArraySet<String> getEnabledComponentsNoCopy() {
227         return mEnabledComponentsWatched;
228     }
229 
230     @NonNull
231     @Override
232     public ArraySet<String> getDisabledComponents() {
233         return mDisabledComponentsWatched == null
234                 ? new ArraySet<>() : mDisabledComponentsWatched.untrackedStorage();
235     }
236 
237     @NonNull
238     @Override
239     public ArraySet<String> getEnabledComponents() {
240         return mEnabledComponentsWatched == null
241                 ? new ArraySet<>() : mEnabledComponentsWatched.untrackedStorage();
242     }
243 
244 
245     @Override
246     public boolean isComponentEnabled(String componentName) {
247         return mEnabledComponentsWatched != null
248                 && mEnabledComponentsWatched.contains(componentName);
249     }
250 
251     @Override
252     public boolean isComponentDisabled(String componentName) {
253         return mDisabledComponentsWatched != null
254                 && mDisabledComponentsWatched.contains(componentName);
255     }
256 
257     @Override
258     public OverlayPaths getAllOverlayPaths() {
259         if (mOverlayPaths == null && mSharedLibraryOverlayPaths == null) {
260             return null;
261         }
262         final OverlayPaths.Builder newPaths = new OverlayPaths.Builder();
263         newPaths.addAll(mOverlayPaths);
264         if (mSharedLibraryOverlayPaths != null) {
265             for (final OverlayPaths libOverlayPaths : mSharedLibraryOverlayPaths.values()) {
266                 newPaths.addAll(libOverlayPaths);
267             }
268         }
269         return newPaths.build();
270     }
271 
272     /**
273      * Overrides the non-localized label and icon of a component.
274      *
275      * @return true if the label or icon was changed.
276      */
277     @VisibleForTesting(visibility = VisibleForTesting.Visibility.PACKAGE)
278     public boolean overrideLabelAndIcon(@NonNull ComponentName component,
279             @Nullable String nonLocalizedLabel, @Nullable Integer icon) {
280         String existingLabel = null;
281         Integer existingIcon = null;
282 
283         if (mComponentLabelIconOverrideMap != null) {
284             Pair<String, Integer> pair = mComponentLabelIconOverrideMap.get(component);
285             if (pair != null) {
286                 existingLabel = pair.first;
287                 existingIcon = pair.second;
288             }
289         }
290 
291         boolean changed = !TextUtils.equals(existingLabel, nonLocalizedLabel)
292                 || !Objects.equals(existingIcon, icon);
293 
294         if (changed) {
295             if (nonLocalizedLabel == null && icon == null) {
296                 mComponentLabelIconOverrideMap.remove(component);
297                 if (mComponentLabelIconOverrideMap.isEmpty()) {
298                     mComponentLabelIconOverrideMap = null;
299                 }
300             } else {
301                 if (mComponentLabelIconOverrideMap == null) {
302                     mComponentLabelIconOverrideMap = new WatchedArrayMap<>(1);
303                     mComponentLabelIconOverrideMap.registerObserver(mSnapshot);
304                 }
305 
306                 mComponentLabelIconOverrideMap.put(component, Pair.create(nonLocalizedLabel, icon));
307             }
308             onChanged();
309         }
310 
311         return changed;
312     }
313 
314     /**
315      * Clears all values previously set by {@link #overrideLabelAndIcon(ComponentName, String,
316      * Integer)}.
317      * <p>
318      * This is done when the package is updated as the components and resource IDs may have
319      * changed.
320      */
321     public void resetOverrideComponentLabelIcon() {
322         mComponentLabelIconOverrideMap = null;
323     }
324 
325     @Nullable
326     public Pair<String, Integer> getOverrideLabelIconForComponent(ComponentName componentName) {
327         if (ArrayUtils.isEmpty(mComponentLabelIconOverrideMap)) {
328             return null;
329         }
330 
331         return mComponentLabelIconOverrideMap.get(componentName);
332     }
333 
334     @Override
335     public boolean isSuspended() {
336         return !CollectionUtils.isEmpty(mSuspendParams);
337     }
338 
339     public PackageUserStateImpl putSuspendParams(@NonNull String suspendingPackage,
340             @Nullable SuspendParams suspendParams) {
341         if (mSuspendParams == null) {
342             mSuspendParams = new WatchedArrayMap<>();
343             mSuspendParams.registerObserver(mSnapshot);
344         }
345         if (!mSuspendParams.containsKey(suspendingPackage)
346                 || !Objects.equals(mSuspendParams.get(suspendingPackage), suspendParams)) {
347             mSuspendParams.put(suspendingPackage, suspendParams);
348             onChanged();
349         }
350 
351         return this;
352     }
353 
354     public PackageUserStateImpl removeSuspension(@NonNull String suspendingPackage) {
355         if (mSuspendParams != null) {
356             mSuspendParams.remove(suspendingPackage);
357             onChanged();
358         }
359         return this;
360     }
361 
362     public @NonNull PackageUserStateImpl setDisabledComponents(@Nullable ArraySet<String> value) {
363         if (value == null) {
364             return this;
365         }
366         if (mDisabledComponentsWatched == null) {
367             mDisabledComponentsWatched = new WatchedArraySet<>();
368             mDisabledComponentsWatched.registerObserver(mSnapshot);
369         }
370         mDisabledComponentsWatched.clear();
371         mDisabledComponentsWatched.addAll(value);
372         onChanged();
373         return this;
374     }
375 
376     public @NonNull PackageUserStateImpl setEnabledComponents(@Nullable ArraySet<String> value) {
377         if (value == null) {
378             return this;
379         }
380         if (mEnabledComponentsWatched == null) {
381             mEnabledComponentsWatched = new WatchedArraySet<>();
382             mEnabledComponentsWatched.registerObserver(mSnapshot);
383         }
384         mEnabledComponentsWatched.clear();
385         mEnabledComponentsWatched.addAll(value);
386         onChanged();
387         return this;
388     }
389 
390     public @NonNull PackageUserStateImpl setEnabledComponents(
391             @Nullable WatchedArraySet<String> value) {
392         mEnabledComponentsWatched = value;
393         if (mEnabledComponentsWatched != null) {
394             mEnabledComponentsWatched.registerObserver(mSnapshot);
395         }
396         onChanged();
397         return this;
398     }
399 
400     public @NonNull PackageUserStateImpl setDisabledComponents(
401             @Nullable WatchedArraySet<String> value) {
402         mDisabledComponentsWatched = value;
403         if (mDisabledComponentsWatched != null) {
404             mDisabledComponentsWatched.registerObserver(mSnapshot);
405         }
406         onChanged();
407         return this;
408     }
409 
410     public @NonNull PackageUserStateImpl setCeDataInode(long value) {
411         mCeDataInode = value;
412         onChanged();
413         return this;
414     }
415 
416     public @NonNull PackageUserStateImpl setInstalled(boolean value) {
417         mInstalled = value;
418         onChanged();
419         return this;
420     }
421 
422     public @NonNull PackageUserStateImpl setStopped(boolean value) {
423         mStopped = value;
424         onChanged();
425         return this;
426     }
427 
428     public @NonNull PackageUserStateImpl setNotLaunched(boolean value) {
429         mNotLaunched = value;
430         onChanged();
431         return this;
432     }
433 
434     public @NonNull PackageUserStateImpl setHidden(boolean value) {
435         mHidden = value;
436         onChanged();
437         return this;
438     }
439 
440     public @NonNull PackageUserStateImpl setDistractionFlags(int value) {
441         mDistractionFlags = value;
442         onChanged();
443         return this;
444     }
445 
446     public @NonNull PackageUserStateImpl setInstantApp(boolean value) {
447         mInstantApp = value;
448         onChanged();
449         return this;
450     }
451 
452     public @NonNull PackageUserStateImpl setVirtualPreload(boolean value) {
453         mVirtualPreload = value;
454         onChanged();
455         return this;
456     }
457 
458     public @NonNull PackageUserStateImpl setEnabledState(int value) {
459         mEnabledState = value;
460         onChanged();
461         return this;
462     }
463 
464     public @NonNull PackageUserStateImpl setInstallReason(@PackageManager.InstallReason int value) {
465         mInstallReason = value;
466         com.android.internal.util.AnnotationValidations.validate(
467                 PackageManager.InstallReason.class, null, mInstallReason);
468         onChanged();
469         return this;
470     }
471 
472     public @NonNull PackageUserStateImpl setUninstallReason(
473             @PackageManager.UninstallReason int value) {
474         mUninstallReason = value;
475         com.android.internal.util.AnnotationValidations.validate(
476                 PackageManager.UninstallReason.class, null, mUninstallReason);
477         onChanged();
478         return this;
479     }
480 
481     public @NonNull PackageUserStateImpl setHarmfulAppWarning(@NonNull String value) {
482         mHarmfulAppWarning = value;
483         onChanged();
484         return this;
485     }
486 
487     public @NonNull PackageUserStateImpl setLastDisableAppCaller(@NonNull String value) {
488         mLastDisableAppCaller = value;
489         onChanged();
490         return this;
491     }
492 
493     public @NonNull PackageUserStateImpl setSharedLibraryOverlayPaths(
494             @NonNull ArrayMap<String, OverlayPaths> value) {
495         if (value == null) {
496             return this;
497         }
498         if (mSharedLibraryOverlayPaths == null) {
499             mSharedLibraryOverlayPaths = new WatchedArrayMap<>();
500             registerObserver(mSnapshot);
501         }
502         mSharedLibraryOverlayPaths.clear();
503         mSharedLibraryOverlayPaths.putAll(value);
504         onChanged();
505         return this;
506     }
507 
508     public @NonNull PackageUserStateImpl setSplashScreenTheme(@NonNull String value) {
509         mSplashScreenTheme = value;
510         onChanged();
511         return this;
512     }
513 
514     /**
515      * Sets user min aspect ratio override value
516      * @see PackageManager.UserMinAspectRatio
517      */
518     public @NonNull PackageUserStateImpl setMinAspectRatio(
519             @PackageManager.UserMinAspectRatio int value) {
520         mMinAspectRatio = value;
521         com.android.internal.util.AnnotationValidations.validate(
522                 PackageManager.UserMinAspectRatio.class, null, mMinAspectRatio);
523         onChanged();
524         return this;
525     }
526 
527     /**
528      * Suspending package to suspend params
529      */
530     public @NonNull PackageUserStateImpl setSuspendParams(
531             @NonNull ArrayMap<String, SuspendParams> value) {
532         if (value == null) {
533             return this;
534         }
535         if (mSuspendParams == null) {
536             mSuspendParams = new WatchedArrayMap<>();
537             registerObserver(mSnapshot);
538         }
539         mSuspendParams.clear();
540         mSuspendParams.putAll(value);
541         onChanged();
542         return this;
543     }
544 
545     public @NonNull PackageUserStateImpl setComponentLabelIconOverrideMap(
546             @NonNull ArrayMap<ComponentName, Pair<String, Integer>> value) {
547         if (value == null) {
548             return this;
549         }
550         if (mComponentLabelIconOverrideMap == null) {
551             mComponentLabelIconOverrideMap = new WatchedArrayMap<>();
552             registerObserver(mSnapshot);
553         }
554         mComponentLabelIconOverrideMap.clear();
555         mComponentLabelIconOverrideMap.putAll(value);
556         onChanged();
557         return this;
558     }
559 
560     public @NonNull PackageUserStateImpl setFirstInstallTimeMillis(long value) {
561         mFirstInstallTimeMillis = value;
562         onChanged();
563         return this;
564     }
565 
566     @NonNull
567     @Override
568     public Map<String, OverlayPaths> getSharedLibraryOverlayPaths() {
569         return mSharedLibraryOverlayPaths == null
570                 ? Collections.emptyMap() : mSharedLibraryOverlayPaths;
571     }
572 
573     @NonNull
574     public PackageUserStateImpl setWatchable(@NonNull Watchable watchable) {
575         mWatchable = watchable;
576         return this;
577     }
578 
579     private boolean watchableEquals(Watchable other) {
580         // Ignore the Watchable for equality
581         return true;
582     }
583 
584     private int watchableHashCode() {
585         // Ignore the Watchable for equality
586         return 0;
587     }
588 
589     private boolean snapshotEquals(SnapshotCache<PackageUserStateImpl> other) {
590         // Ignore the SnapshotCache for equality
591         return true;
592     }
593 
594     private int snapshotHashCode() {
595         // Ignore the SnapshotCache for equality
596         return 0;
597     }
598 
599 
600 
601     // Code below generated by codegen v1.0.23.
602     //
603     // DO NOT MODIFY!
604     // CHECKSTYLE:OFF Generated code
605     //
606     // To regenerate run:
607     // $ codegen $ANDROID_BUILD_TOP/frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java
608     //
609     // To exclude the generated code from IntelliJ auto-formatting enable (one-time):
610     //   Settings > Editor > Code Style > Formatter Control
611     //@formatter:off
612 
613 
614     @DataClass.Generated.Member
615     public @Nullable WatchedArraySet<String> getDisabledComponentsWatched() {
616         return mDisabledComponentsWatched;
617     }
618 
619     @DataClass.Generated.Member
620     public @Nullable WatchedArraySet<String> getEnabledComponentsWatched() {
621         return mEnabledComponentsWatched;
622     }
623 
624     @DataClass.Generated.Member
625     public long getCeDataInode() {
626         return mCeDataInode;
627     }
628 
629     @DataClass.Generated.Member
630     public boolean isInstalled() {
631         return mInstalled;
632     }
633 
634     @DataClass.Generated.Member
635     public boolean isStopped() {
636         return mStopped;
637     }
638 
639     @DataClass.Generated.Member
640     public boolean isNotLaunched() {
641         return mNotLaunched;
642     }
643 
644     @DataClass.Generated.Member
645     public boolean isHidden() {
646         return mHidden;
647     }
648 
649     @DataClass.Generated.Member
650     public int getDistractionFlags() {
651         return mDistractionFlags;
652     }
653 
654     @DataClass.Generated.Member
655     public boolean isInstantApp() {
656         return mInstantApp;
657     }
658 
659     @DataClass.Generated.Member
660     public boolean isVirtualPreload() {
661         return mVirtualPreload;
662     }
663 
664     @DataClass.Generated.Member
665     public @PackageManager.EnabledState int getEnabledState() {
666         return mEnabledState;
667     }
668 
669     @DataClass.Generated.Member
670     public @PackageManager.InstallReason int getInstallReason() {
671         return mInstallReason;
672     }
673 
674     @DataClass.Generated.Member
675     public @PackageManager.UninstallReason int getUninstallReason() {
676         return mUninstallReason;
677     }
678 
679     @DataClass.Generated.Member
680     public @Nullable String getHarmfulAppWarning() {
681         return mHarmfulAppWarning;
682     }
683 
684     @DataClass.Generated.Member
685     public @Nullable String getLastDisableAppCaller() {
686         return mLastDisableAppCaller;
687     }
688 
689     @DataClass.Generated.Member
690     public @Nullable OverlayPaths getOverlayPaths() {
691         return mOverlayPaths;
692     }
693 
694     @DataClass.Generated.Member
695     public @Nullable String getSplashScreenTheme() {
696         return mSplashScreenTheme;
697     }
698 
699     @DataClass.Generated.Member
700     public @PackageManager.UserMinAspectRatio int getMinAspectRatio() {
701         return mMinAspectRatio;
702     }
703 
704     /**
705      * Suspending package to suspend params
706      */
707     @DataClass.Generated.Member
708     public @Nullable WatchedArrayMap<String,SuspendParams> getSuspendParams() {
709         return mSuspendParams;
710     }
711 
712     @DataClass.Generated.Member
713     public @Nullable WatchedArrayMap<ComponentName,Pair<String,Integer>> getComponentLabelIconOverrideMap() {
714         return mComponentLabelIconOverrideMap;
715     }
716 
717     @DataClass.Generated.Member
718     public @CurrentTimeMillisLong long getFirstInstallTimeMillis() {
719         return mFirstInstallTimeMillis;
720     }
721 
722     @DataClass.Generated.Member
723     public @NonNull SnapshotCache<PackageUserStateImpl> getSnapshot() {
724         return mSnapshot;
725     }
726 
727     @DataClass.Generated.Member
728     public @NonNull PackageUserStateImpl setDisabledComponentsWatched(@NonNull WatchedArraySet<String> value) {
729         mDisabledComponentsWatched = value;
730         return this;
731     }
732 
733     @DataClass.Generated.Member
734     public @NonNull PackageUserStateImpl setEnabledComponentsWatched(@NonNull WatchedArraySet<String> value) {
735         mEnabledComponentsWatched = value;
736         return this;
737     }
738 
739     @DataClass.Generated.Member
740     public @NonNull PackageUserStateImpl setSharedLibraryOverlayPaths(@NonNull WatchedArrayMap<String,OverlayPaths> value) {
741         mSharedLibraryOverlayPaths = value;
742         return this;
743     }
744 
745     /**
746      * Suspending package to suspend params
747      */
748     @DataClass.Generated.Member
749     public @NonNull PackageUserStateImpl setSuspendParams(@NonNull WatchedArrayMap<String,SuspendParams> value) {
750         mSuspendParams = value;
751         return this;
752     }
753 
754     @DataClass.Generated.Member
755     public @NonNull PackageUserStateImpl setComponentLabelIconOverrideMap(@NonNull WatchedArrayMap<ComponentName,Pair<String,Integer>> value) {
756         mComponentLabelIconOverrideMap = value;
757         return this;
758     }
759 
760     @Override
761     @DataClass.Generated.Member
762     public boolean equals(@Nullable Object o) {
763         // You can override field equality logic by defining either of the methods like:
764         // boolean fieldNameEquals(PackageUserStateImpl other) { ... }
765         // boolean fieldNameEquals(FieldType otherValue) { ... }
766 
767         if (this == o) return true;
768         if (o == null || getClass() != o.getClass()) return false;
769         @SuppressWarnings("unchecked")
770         PackageUserStateImpl that = (PackageUserStateImpl) o;
771         //noinspection PointlessBooleanExpression
772         return true
773                 && Objects.equals(mDisabledComponentsWatched, that.mDisabledComponentsWatched)
774                 && Objects.equals(mEnabledComponentsWatched, that.mEnabledComponentsWatched)
775                 && mCeDataInode == that.mCeDataInode
776                 && mInstalled == that.mInstalled
777                 && mStopped == that.mStopped
778                 && mNotLaunched == that.mNotLaunched
779                 && mHidden == that.mHidden
780                 && mDistractionFlags == that.mDistractionFlags
781                 && mInstantApp == that.mInstantApp
782                 && mVirtualPreload == that.mVirtualPreload
783                 && mEnabledState == that.mEnabledState
784                 && mInstallReason == that.mInstallReason
785                 && mUninstallReason == that.mUninstallReason
786                 && Objects.equals(mHarmfulAppWarning, that.mHarmfulAppWarning)
787                 && Objects.equals(mLastDisableAppCaller, that.mLastDisableAppCaller)
788                 && Objects.equals(mOverlayPaths, that.mOverlayPaths)
789                 && Objects.equals(mSharedLibraryOverlayPaths, that.mSharedLibraryOverlayPaths)
790                 && Objects.equals(mSplashScreenTheme, that.mSplashScreenTheme)
791                 && mMinAspectRatio == that.mMinAspectRatio
792                 && Objects.equals(mSuspendParams, that.mSuspendParams)
793                 && Objects.equals(mComponentLabelIconOverrideMap, that.mComponentLabelIconOverrideMap)
794                 && mFirstInstallTimeMillis == that.mFirstInstallTimeMillis
795                 && watchableEquals(that.mWatchable)
796                 && snapshotEquals(that.mSnapshot);
797     }
798 
799     @Override
800     @DataClass.Generated.Member
801     public int hashCode() {
802         // You can override field hashCode logic by defining methods like:
803         // int fieldNameHashCode() { ... }
804 
805         int _hash = 1;
806         _hash = 31 * _hash + Objects.hashCode(mDisabledComponentsWatched);
807         _hash = 31 * _hash + Objects.hashCode(mEnabledComponentsWatched);
808         _hash = 31 * _hash + Long.hashCode(mCeDataInode);
809         _hash = 31 * _hash + Boolean.hashCode(mInstalled);
810         _hash = 31 * _hash + Boolean.hashCode(mStopped);
811         _hash = 31 * _hash + Boolean.hashCode(mNotLaunched);
812         _hash = 31 * _hash + Boolean.hashCode(mHidden);
813         _hash = 31 * _hash + mDistractionFlags;
814         _hash = 31 * _hash + Boolean.hashCode(mInstantApp);
815         _hash = 31 * _hash + Boolean.hashCode(mVirtualPreload);
816         _hash = 31 * _hash + mEnabledState;
817         _hash = 31 * _hash + mInstallReason;
818         _hash = 31 * _hash + mUninstallReason;
819         _hash = 31 * _hash + Objects.hashCode(mHarmfulAppWarning);
820         _hash = 31 * _hash + Objects.hashCode(mLastDisableAppCaller);
821         _hash = 31 * _hash + Objects.hashCode(mOverlayPaths);
822         _hash = 31 * _hash + Objects.hashCode(mSharedLibraryOverlayPaths);
823         _hash = 31 * _hash + Objects.hashCode(mSplashScreenTheme);
824         _hash = 31 * _hash + mMinAspectRatio;
825         _hash = 31 * _hash + Objects.hashCode(mSuspendParams);
826         _hash = 31 * _hash + Objects.hashCode(mComponentLabelIconOverrideMap);
827         _hash = 31 * _hash + Long.hashCode(mFirstInstallTimeMillis);
828         _hash = 31 * _hash + watchableHashCode();
829         _hash = 31 * _hash + snapshotHashCode();
830         return _hash;
831     }
832 
833     @DataClass.Generated(
834             time = 1687938397579L,
835             codegenVersion = "1.0.23",
836             sourceFile = "frameworks/base/services/core/java/com/android/server/pm/pkg/PackageUserStateImpl.java",
837             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 @android.content.pm.PackageManager.EnabledState int mEnabledState\nprivate @android.content.pm.PackageManager.InstallReason int mInstallReason\nprivate @android.content.pm.PackageManager.UninstallReason int mUninstallReason\nprivate @android.annotation.Nullable java.lang.String mHarmfulAppWarning\nprivate @android.annotation.Nullable java.lang.String mLastDisableAppCaller\nprivate @android.annotation.Nullable android.content.pm.overlay.OverlayPaths mOverlayPaths\nprotected @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,android.content.pm.overlay.OverlayPaths> mSharedLibraryOverlayPaths\nprivate @android.annotation.Nullable java.lang.String mSplashScreenTheme\nprivate @android.content.pm.PackageManager.UserMinAspectRatio int mMinAspectRatio\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams> mSuspendParams\nprivate @android.annotation.Nullable com.android.server.utils.WatchedArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>> mComponentLabelIconOverrideMap\nprivate @android.annotation.CurrentTimeMillisLong long mFirstInstallTimeMillis\nprivate @android.annotation.Nullable com.android.server.utils.Watchable mWatchable\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 setMinAspectRatio(int)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setSuspendParams(android.util.ArrayMap<java.lang.String,com.android.server.pm.pkg.SuspendParams>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setComponentLabelIconOverrideMap(android.util.ArrayMap<android.content.ComponentName,android.util.Pair<java.lang.String,java.lang.Integer>>)\npublic @android.annotation.NonNull com.android.server.pm.pkg.PackageUserStateImpl setFirstInstallTimeMillis(long)\npublic @android.annotation.NonNull @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()\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)")
838     @Deprecated
839     private void __metadata() {}
840 
841 
842     //@formatter:on
843     // End of generated code
844 
845 }
846