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